testfloat_ver
John R. Hauser
2017 February 10
The testfloat_ver
program accepts test-case results obtained from
exercising an implementation of floating-point arithmetic and verifies that
those results conform to the IEEE Standard for Binary Floating-Point
Arithmetic.
testfloat_ver
is part of the Berkeley TestFloat package, a small
collection of programs for performing such tests.
For general information about TestFloat, see file
TestFloat-general.html
A single execution of testfloat_ver
verifies results for only a
single floating-point operation and associated options.
The testfloat_ver
program must be repeatedly executed to verify
results for each operation to be tested.
The test cases to be verified are read by testfloat_ver
from
standard input.
This input will typically be piped from another program that, for each test
case, invokes the floating-point operation and writes out the results.
The format of testfloat_ver
’s input is raw hexadecimal text,
described in the section below titled Input Format.
For each test case given to it, testfloat_ver
examines the
computed results and reports any unexpected results as likely errors.
For more about the operation of testfloat_ver
and how to interpret
its output, refer to
TestFloat-general.html
The testfloat_ver
program is executed as a command with this
syntax:
Square brackets (testfloat_ver [<option>...] <function>
[ ]
) denote optional arguments,
<option>
is a supported option, and
<function>
is the name of a testable operation.
The available options are documented below.
The testable operation names are listed in
TestFloat-general.html
testfloat_ver
is executed without any arguments, a summary of
usage is written.
The testfloat_ver
program accepts several command options.
If mutually contradictory options are given, the last one has priority.
-help
The -help
option causes a summary of program usage to be written,
after which the program exits.
-errors <num>
The -errors
option instructs testfloat_ver
to report
no more than the specified number of errors.
The argument to -errors
must be a nonnegative decimal integer.
Once the specified number of error reports has been generated, the program
exits.
The default is -errors
20
Against intuition, -errors
0
testfloat_ver
to continue for any number of errors.
-checkNaNs
The -checkNaNs
option causes testfloat_ver
to verify
the bitwise correctness of NaN results.
In order for this option to be sensible, testfloat_ver
must have
been compiled so that its internal reference implementation of floating-point
(Berkeley SoftFloat) generates the proper NaN results for the system being
tested.
-precision32, -precision64, -precision80
When <function>
is an -precision32
option indicates that the rounding precision should
be -precision64
indicates that the rounding precision
should be -precision80
indicates that the rounding
precision should be the full -precision80
.
-rnear_even, -rnear_maxMag, -rminMag, -rmin, -rmax, -rodd
When <function>
is an operation that requires
rounding, the -rnear_even
option indicates that rounding should be
to nearest/even, -rnear_maxMag
indicates rounding to
nearest/maximum magnitude (nearest-away), -rminMag
indicates
rounding to minimum magnitude (toward zero), -rmin
indicates
rounding to minimum (down, toward negative infinity), -rmax
indicates rounding to maximum (up, toward positive infinity), and
-rodd
, if supported, indicates rounding to odd.
These options are ignored for operations that are exact and thus do not round.
When rounding mode is relevant but not specified, the default assumption is
rounding to nearest/even, same as -rnear_even
.
-tininessbefore, -tininessafter
When <function>
is an operation that requires
rounding, the -tininessbefore
option indicates that tininess on
underflow should be detected before rounding, while -tininessafter
indicates that tininess on underflow should be detected after rounding.
These options are ignored for operations that are exact and thus do not round.
When the method of tininess detection matters but is not specified, the default
assumption is that tininess should be detected after rounding, same as
-tininessafter
.
-notexact, -exact
When <function>
is an operation that rounds to an
integer (either conversion to an integer type or a roundToInt
operation), the -notexact
option indicates that the inexact
exception flag should never be raised, while -exact
indicates that
the inexact exception flag should be raised when the result is inexact.
For other operations, these options are ignored.
If neither option is specified, the default assumption is that the
inexact exception flag should not be raised when rounding to an integer,
same as -notexact
.
For a given <function>
argument, the input format
expected by testfloat_ver
is the same as the output generated by
program
testfloat_gen
Input to testfloat_ver
is expected to be text, with each line
containing the data for one test case.
The number of input lines thus equals the number of test cases.
A single test case is organized as follows: first are the operands for the
operation, next is the result value obtained, and last is a number indicating
the exception flags that were raised.
These values are all expected to be provided as raw hexadecimal numbers
separated on the line by spaces.
For example, for the command
valid input could include these lines:testfloat_ver f64_add
On each line above, the first two hexadecimal numbers represent the3F90EB5825D6851E C3E0080080000000 C3E0080080000000 01 41E3C00000000000 C182024F8AE474A8 41E377F6C1D46E2D 01 7FD80FFFFFFFFFFF 7FEFFFFFFFFFFF80 7FF0000000000000 05 3FFFED6A25C534BE 3CA1000000020000 3FFFED6A25C534BF 01 ...
Note that, for floating-point values, the sign and exponent are at the
most-significant end of the number.
Thus, for the first number on the first line above, the leading hexadecimal
digits 3F9
are the sign and encoded exponent of the
Exception flags are encoded with one bit per flag as follows:
bit 0
inexact exception bit 1 underflow exception bit 2 overflow exception bit 3 infinite exception (“divide by zero”) bit 4 invalid exception


2 references to Get
System.Management.Automation (2)
engine\MshReference.cs (1)
75
CallSite<Func<CallSite, object, object, object>>.Create(PSCreateInstanceBinder.
Get
(new CallInfo(1), null));
engine\parser\Compiler.cs (1)
6367
? (CallSiteBinder)PSCreateInstanceBinder.
Get
(callInfo, constraints, publicTypeOnly: true)


Generated at {{ timestamp.strftime('%Y-%m-%d %H:%M') }} UTC. Statistics are generated every 12 hours.
| Work Orders | {% for status in statuses %}{{ status }} | {% endfor %}Total Open | Total Closed | Total |
|---|---|---|---|---|
| Claimed | {% for status in statuses %}{{ claimed_status_counts[status] }} | {% endfor %}{{ claimed_open_count }} | {{ claimed_closed_count }} | {{ claimed_status_total }} |
| Unclaimed | {% for status in statuses %}{{ unclaimed_status_counts[status] }} | {% endfor %}{{ unclaimed_open_count }} | {{ unclaimed_closed_count }} | {{ unclaimed_status_total }} |
| Total | {% for status in statuses %}{{ total_status_counts[status] }} | {% endfor %}{{ total_open_total }} | {{ total_closed_total }} | {{ total_status_total }} |
| Incident | Organization | Claimed Work Orders | Open | Closed | Reported | Last Login |
|---|---|---|---|---|---|---|
| {{ event.name }} | {{ org.name }} {% if not org.is_active and not org.org_verified %} (inactive; unverified) {% elif not org.is_active %} (inactive) {% elif not org.org_verified %} (unverified) {% endif %} | {{ org_claimed_counts[org_id] }} | {{ org_open_counts[org_id] }} | {{ org_closed_counts[org_id] }} | {{ org_reported_counts[org_id] }} | {{ org.timestamp_login.strftime('%Y-%m-%d %H:%M') if org.timestamp_login else None }} |
| Totals | {{ org_claimed_total }} | {{ org_open_total }} | {{ org_closed_total }} | {{ org_reported_total }} |
| Work Type | Open | Closed | Total |
|---|---|---|---|
| {{ work_type }} | {{ work_type_open_counts[work_type] }} | {{ work_type_closed_counts[work_type] }} | {{ work_type_totals[work_type] }} |
| County | Open | Closed | Total |
|---|---|---|---|
| {{ county }} | {{ county_open_counts[county] }} | {{ county_closed_counts[county] }} | {{ county_totals[county] }} |
| Since Requested | |
|---|---|
| Average Days Waiting for Open Work Orders | {{ "%0.2f" % average_days_waiting_for_open_work_orders }} |


This element provides a C++ typedef topic type as a link in a DITA map.
A <cxxTypedefRef> element can contain <topicref> and <topicmeta> elements, allowing you to express navigation or table-of-contents hierarchies, as well as implying relationships between the containing topicref and its children.
<cxxAPIMap id="" title="AMap"> <cxxFileRef href="afile.xml" navtitle="AFile.h" > <cxxDefineRef href="adefine.xml" navtitle="AClass::aDefine" /> <cxxEnumerationRef href="anenum.xml" navtitle="AClass::anEnum" /> <cxxFunctionRef href="afunction.xml" navtitle="AClass::aFunction" /> <cxxTypedefRef href="atypedef.xml" navtitle="AClass::aTypeDef" /> <cxxVariableRef href="avariable.xml" navtitle="AClass::aVariable" /> </cxxFileRef> </cxxAPIMap>


{% load staticfiles %}
| Date | Publisher | Titre | Link | Views | Reactions | Comments | Shares |
|---|---|---|---|---|---|---|---|
| {{publisher.datepub}} | {{publisher.page_name}} | {{publisher.title}} | {{publisher.link}} | {{publisher.views}} | {{publisher.reactions}} | {{publisher.comments}} | {{publisher.shares}} |


Environment
Street View
Google+ #photosphere
Teapot
Color
Shininess
Reflection Blur
Shadow
Texture
Bump Map
Image Library
(Drag to texture or bump map)
+ add
Your browser does not support canvas. Please use one that supports it, e.g.
Chrome
.


Home
About us
Online-order
contact
Your browser does not support the tag
Name of Pizza
Chicken
Vegetables
Meat
Size of the pizza
Small
Medium
Large
Toppings
Pepperoni
Extra cheese
Green peppers
Pizza Crust
Thin Crust
Thick Crust
Cheese Filled Crust
Stuffed Crust
Number of Pizza's
Order and review
Your Order
Name:
Size:
Quantity:
Crusts:
Toppings:
Delivery:
Total:


This is the partial for view 1.
Let's try this simple notify service, injected into the controller...
(you have to click 3 times to see an alert)


Toggle Options
Toggle chat
Home
Donate
Grab
Line
Brush
Brush Size:
Drawroom:
Change room
Name:
Change name
Private one on one
Login
With whom do you want to draw?
Multiple random people (max. 14)
Private random chat (1 on 1)
Invite friends or draw alone
Play guess the drawing
Check out some other projects:
Name:
NeuralCar 2.0 (Open Source)
Description:
Second version of the car simulation. Each car has a neural network that controls it. Those then go trough generations of evolution till they can drive themself.
Name:
SimpleLogic (Open Source)
Description:
Logic gates simulation in the browser with the ability to share modules. It's also fairly easy to create new nodes.
Name:
Pong (Kevin)
Description:
The classic pong game as a html5 game made for learning purposes.
Name:
WebReviewPlugin
Description:
A chrome plugin that easily lets you search reviews for websites and review websites yourself.
Name:
Squarific homepage
Description:
A collection of my best projects.
Type:
Procedural Image
Description:
Images generated using neural networks, you select the image the looks like you want and it will evolve. (Not fully finished)
Close
I hope you are enjoying the app!
I definitely enjoyed making it. I want to ask your help though.
Keeping this up costs money and I want to continue working on this.
Share this website with your friends, help program if you can and if possible donate some money.
Bitcoin: 148a4MsNDoRh7cpCidxUNwM63eQr1UNtkb
Planned features:
Chat
Rooms
Multiple and smaller main rooms
Only allow certain sizes
See room history / persist drawings
See room history / persist drawings
Grab tool / looking around
Better memory managenent using chunks
See who is drawing
Kick/Ban
Private rooms
Limited amount of ink
Fullscreen and better layout
Share room links
Private one on one mode
History viewer
Guess the drawing game
Close
If the account does not exist yet it will be created.
Username/Email
Password
Close
Create new gameroom
Join existing gameroom


measles HCWs vaccine Measles vaccination infection {border-style status px;} #ffffff;} workers control healthcare training (Yes) study Health Infect Zagazig immune virus (.%) coverage HCWs’ Vaccine health patient Egypt children collab: vaccinated work (.–.) HCWs. Healthcare Table World immunization occupational px; using {font-family font-size knowledge participants performed previously reported significant transmitted Accessed Available University care compulsory current data double; factors patients practice prevention protective showed source transmission .%, Control Department El-Sokkary HCWs, However, Organization Regarding Study attitude border-color border-width considered costs courses dealing diseases from: hospital important infection, marital mask measles, measles. personal predicting previous questionnaire recommended regarding risk seronegative solid; spread vaccinations years {font-style {font-weight (WHO) (n=) Action Data Dis IgG Immune Med Medical Medicine, Pediatric Plan Questions Vaccination assess associated attitude, attitudes aware bold check courier; course disease em; exposure, higher immunity influencing offenders patients. positive pt;} readiness results studies. study. susceptible taking test vaccination. vaccine,


Assets
(Total Upkeep:
$0
)
Your Assets Maintain Your Level
Your Parent's Basement
Cool Point Value:
-1
Studio Apartment
Upkeep: -$9,600
Cool Point Value:
20,000
$29,000
Owned:100
1
10
50
100
Starter House
Upkeep: -$24,400
Cool Point Value:
52,000
$129,000
Owned:100
1
10
50
100
Luxury Apartment
Upkeep: -$34,000
Cool Point Value:
90,000
$200,000
Owned:100
1
10
50
100
Condo
Upkeep: -$59,600
Cool Point Value:
302,000
$1,129,000
Owned:100
1
10
50
100
Penthouse
Upkeep: -$124,600
Cool Point Value:
395,000
$6,029,000
Owned:100
1
10
50
100
Mansion
Upkeep: -$273,000
Cool Point Value:
450,000
$15,000,2000
Owned:100
1
10
50
100


Contact Evan for login details to try out the app and see how it works.
A lot of people buy things like lawncare equipment, tools, camping equipment, cooking appliances, etc. that they use only occasionally and the items just sit there unused most of the time. This wastes money, takes up space, and isn't efficient. If people could easily show what items they own that others could borrow, it would save a lot of money and be a more efficient use of everyone's resources.
Users of NeighborShare can create an account, add items to share, upload a picture from their computer or directly from their phone, and see what items other users have offered to share. Users can type a search term or browse shared items by category or owner and can click a button to automatically generate an email notifying the owner of the user's desire to borrow that item.


README
Dump patch JSON
Select patch:
Brass
Buzz Lead
Clean Bass
Dirty Bass
Glass Harmonica
Soft Lead
Space Pad
Synth Brass
Synth String


Privacy Policy
Neoseeker Privacy Policy
Neoseeker and its Operators, Neo Era Media, Inc. understand and respect the need for the privacy of its users. To keep you informed of our privacy policies, we have provided this document disclosing Neo Era Media's intent, purpose and use of possibly private information, and detailing the methods of gathering of such information.
Neoseeker works with a third party (NetShelter) that serve ads to the site. To find out more about how NetShelter manages the privacy of information in conjunction with serving ads on our site please follow this link to go to NetShelter's Privacy Policy section of our privacy page.
Neoseeker may also use other third-party advertising companies to serve ads. These companies may use information (not including your name, address, email address or telephone number) about your visits to this and other websites in order to provide advertisements about goods and services of interest to you. If you would like more information about this practice and to know your choices about not having this information used by these companies, please see this opt out page.
Except as disclosed above regarding third-party advertising companies, visitors to Neoseeker are not subject to involuntary information disclosure of any nature to our servers, other than those intrinsic to the operation of the site and the World Wide Web in general. Certain operations and features on Neoseeker may require the use of cookies and/or the propagation of session information. These cookies and sessions facilitate the visitor's experience at Neoseeker, but do not represent any other security or privacy concern outside of isolated, per visit session identification and/or recurring sessions for the purpose of storing and maintaining user submitted site preferences. Neoseeker does not intentionally use these cookies to "track" users and will not provide any individually identifying information from cookies originating at Neoseeker.com to any third party, even advertisers and sponsors.
Neoseeker does not collect private information from its users without their knowledge. Generally, users who come to Neoseeker are not required to disclose personal or private information. However, some special services such as forums and user content may require registration in order to allow full access to features. Further, Neoseeker encourages users to provide cursory private and/or personal information to build the community aspect of the site, and to obtain basic group demographics data for statistical analysis. Neoseeker does NOT sell, lease or rent to third parties, any private information linkable to a particular user and gathered through the registration process, without express consent from its users as indicated through information forms that users voluntarily fill out.
From time to time, Neoseeker will offer incentives to users in the form of contests, prizes, and giveaways, and request that users fill out surveys or questionnaires to qualify for participation in these special promotions. Unless explicitly indicated, information from these surveys, and questionnaires are used in group demographics studies and for better audience targeting - no direct relationship between demographic data and individual users is ever available to third parties.
Neoseeker will take reasonable precautionary measures to protect and safeguard all information gathered from its users. Neoseeker does not, however, take any responsibility for any breach of security, accidental disclosure, theft, or tampering of its users' information.
Privacy for Children - As per COPA
Although Neoseeker is generally targeted to an adult audience, we welcome the visitation and participation of young users, with their parents' consent. It is strongly recommended that users under the age of 13 refrain from disclosing any personal and/or private information either through the user registration system, or through participation in questionnaires and surveys, and instead opt to remain anonymous in their participation of site activities.
Please note that as of April 21st, 2000, the Child Online Protection Act of 1998 prohibits Neoseeker from the collection of private information from users under the age of 13 without parental consent. Users under the age of 13 must provide a signed letter from their parents to indicate that they are aware of their child's activities on Neoseeker and consent to these activities. This letter must be mailed or faxed to Neo Era Media, Inc using the contact information below, before they can participate in activities requesting the disclosure of private information.
Parents of our younger users may at any time, revoke their consent, and may request to review and edit the private information disclosed by sending a written request to Neo Era Media,Inc. via fax or mail.
Though Neoseeker will take reasonable measures to ensure that users under the age of 13 do not disclose their private information without first obtaining parental consent, the site cannot guarantee the protection of young users who choose not to disclose their age and who do not follow the requirements set forth by COPA.
Privacy Contact Info:
Neo Era Media, Inc.
PO Box 27531
Oakridge
Vancouver, BC
V5Z 4M4


Purpose of Presentation - to look at the main patterns used in Users Interface Design with a view to summarise the most useful for building a UX Toolkit
- the most distinct visual indicator of a Non Modal screen is the visibility of the navigation. Which should tell us 3 things.
Where we need to scale our navigation options we should probably use Primary and Secondary navigation menus. This will allow us to balance the need between having as much transparency as possible, without surrendering all our screen space to the navigation.
An example of this approach is the way in which Apple and Google introduced Tab menus on their mobile interfaces creating a small but Primary navigation which is always in view on Non Modal Screens.
Other navigation options are found on the Secondary nav menu accessed through the hamburger menu.
On a smaller Desktop/Tablet view a reasonable in between stage would seem to be where a Primary side menu reduces in size and appears as icons (Wordpress, Gitlab etc.)
This puts the delete 'button/link' under a 3 dot dropdown menu.
This discloses functionality (like delete) on the list row only when a object is selected.


Module: Procreate::Swatches
- Defined in:
- lib/procreate/swatches.rb,
lib/procreate/swatches/parser.rb,
lib/procreate/swatches/version.rb,
lib/procreate/swatches/wrapper.rb,
lib/procreate/swatches/exporter.rb,
lib/procreate/swatches/colors_helper.rb,
lib/procreate/swatches/errors/invalid_path.rb,
lib/procreate/swatches/errors/invalid_format.rb
Overview
Interact with .swatches
files (Procreate) and manipulate them.
Defined Under Namespace
Modules: ColorsHelper, Errors Classes: Exporter, Parser, Wrapper
Constant Summary collapse
- SWATCHES_FILE_NAME =
Internal name of the
.swatches
file. Used for both parsing and exporting.swatches
files. 'Swatches.json'
- VERSION =
Current gem version
'0.1.0'
Class Method Summary collapse
-
.export(name, colors, options = {}) ⇒ String
(also: to_file)
Export an array of colors to a
.swatches
file, with the possibility to provide a custom palette name. -
.parse(file_path) ⇒ Procreate::Swatches::Wrapper
(also: from_file)
Parse a
.swatches
file from the provided file path.
Class Method Details
.export(name, colors, options = {}) ⇒ String Also known as: to_file
Export an array of colors to a .swatches
file, with the
possibility to provide a custom palette name.
50 51 52 53 54 |
# File 'lib/procreate/swatches.rb', line 50 def export(name, colors, = {}) wrapper = Wrapper.new(name, colors) Exporter.call(wrapper, ) end |
.parse(file_path) ⇒ Procreate::Swatches::Wrapper Also known as: from_file
Parse a .swatches
file from the provided file path
35 36 37 |
# File 'lib/procreate/swatches.rb', line 35 def parse(file_path) Parser.call(file_path) end |


{% include service/head.html %}
{% include nav.html %} {% include service/header.html %} {% include service/service-resume.html %} {% include portfolio.html %} {% include contact.html %} {% include scripts.html %}


2048
0
2960
New Game
Play
2048 Game
Online
Join the numbers and get to the
2048 tile!
Keep playing
Try again
4
2


| Package | Description |
|---|---|
| s3games.ai | |
| s3games.engine | |
| s3games.engine.expr | |
| s3games.gui | |
| s3games.player |
| Modifier and Type | Method and Description |
|---|---|
double |
DistanceFromGoalHeuristic.heuristic(GameState gameState,
int forPlayer)
takes a current state and compares it with a goal state element by element, and sums the number of differences - not implemented yet
|
abstract double |
Heuristic.heuristic(GameState gameState,
int forPlayer)
a heuristic receives the current state and player number - from whose viewpoint the game situation is to be evaluated.
|
double |
MoreStonesHeuristic.heuristic(GameState gameState,
int forPlayer)
returns a value -1..1 depending on the ratio of the player's and opponent's elements on the relevant locations on the board
|
double |
Puzzle8Heuristic.heuristic(GameState gameState,
int forPlayer)
return a sum of distances to target locations of all elements
|
| Modifier and Type | Field and Description |
|---|---|
GameState |
Game.state
current state of the game
|
| Modifier and Type | Method and Description |
|---|---|
GameState |
GameState.getCopy()
return a copy of this state state
|
| Modifier and Type | Method and Description |
|---|---|
boolean |
GameState.equals(GameState other)
implementation of the equals() method - we ignore irrelevant locations and look only at element types, not the element names
|
Move |
GameState.findMove(GameState newState)
compares this state with newState, and returns a move that leads from this state to a new state
|
| Modifier and Type | Method and Description |
|---|---|
GameState |
Context.getState()
retrieve the game sate in this context
|
| Modifier and Type | Method and Description |
|---|---|
void |
Context.setState(GameState state)
set the game state for this context - the same context is reused when
searching through the game tree, a particular current state always
needs to be set
|
| Constructor and Description |
|---|
Context(GameState state,
GameSpecification specs,
Robot robot)
construct a new empty context
|
| Modifier and Type | Method and Description |
|---|---|
void |
BoardCanvas.setState(GameState egs)
controller sends the current game state to here
|
void |
GameWindow.setState(GameState egs)
set the current state of the game and visualize it
|
| Modifier and Type | Method and Description |
|---|---|
java.util.HashMap<Move,GameState> |
MiniMaxPlayer.expand(GameState state,
java.util.HashSet<Move> moves,
double ratio)
the only difference to standard minimax player is that here we ignore some
of the moves when we expand a move
|
| Modifier and Type | Method and Description |
|---|---|
protected abstract void |
AbstractMonteCarloPlayer.addScore(GameState gs,
int i)
add to the scores depending on the game result of this trial
|
protected void |
MonteCarloClassicPlayer.addScore(GameState gs,
int playerNumber)
we add 1, if we won
|
protected void |
MonteCarloRatioPlayer.addScore(GameState gs,
int i)
add the score after each trial
|
protected void |
MonteCarloRatioPlayer2.addScore(GameState gs,
int i)
add the current trial to the overall scores
|
java.util.HashMap<Move,GameState> |
MiniMaxPlayer.expand(GameState state,
java.util.HashSet<Move> moves,
double ratio)
the only difference to standard minimax player is that here we ignore some
of the moves when we expand a move
|
Move |
AStarPlayer.move(GameState state,
java.util.ArrayList<Move> allowedMoves)
A* player makes a move - it searches all the way to find the closest winning state and performs a move that is leading towards it.
|
Move |
AbstractMonteCarloPlayer.move(GameState state,
java.util.ArrayList<Move> allowedMoves)
make a move.
|
Move |
BreadthFirstSearchPlayer.move(GameState state,
java.util.ArrayList<Move> allowedMoves)
take a move using BFS algorithm.
|
Move |
CameraPlayer.move(GameState state,
java.util.ArrayList<Move> allowedMoves)
request the user to make a move, ask the camera to detect the visible
objects and try to figure out what has been moved
|
Move |
DepthFirstSearchPlayer.move(GameState state,
java.util.ArrayList<Move> allowedMoves)
make a move using DFS strategy - search the state space in depth,
when finding a first winning state, return a move that is leading towards it
|
Move |
MiniMaxPlayer.move(GameState state,
java.util.ArrayList<Move> allowedMoves)
make one minimax move: try to expand the game tree as far as it gets,
evaluating the rest with the heuristic when the time is used up
|
Move |
MousePlayer.move(GameState state,
java.util.ArrayList<Move> allowedMoves)
wait for the human user to perform a move and return it
|
abstract Move |
Player.move(GameState state,
java.util.ArrayList<Move> allowedMoves)
make a single move
|
Move |
RandomGeneralPlayer.move(GameState state,
java.util.ArrayList<Move> allowedMoves)
perform a random move
|
MiniMaxPlayer.Node |
MiniMaxPlayer.newNode(MiniMaxPlayer.Node previous,
GameState gs)
creates a new node that was reached by performing some move from the previous node.
|
void |
Player.otherMoved(Move move,
GameState newState)
information about the move made by another player - override if needed
|
protected abstract void |
AbstractMonteCarloPlayer.updateRatio(GameState gs,
java.util.Set<Move> moves)
update the ratio depending on the branching in the current state
|
protected void |
MonteCarloClassicPlayer.updateRatio(GameState gs,
java.util.Set<Move> moves)
classical monte-carlo does not update the ratio
|
protected void |
MonteCarloRatioPlayer.updateRatio(GameState gs,
java.util.Set<Move> moves)
opponent moves are taxing the ratio depending on the state neighborhood size
|
protected void |
MonteCarloRatioPlayer2.updateRatio(GameState gs,
java.util.Set<Move> moves)
update the current trial ratio every time a move is made
|
| Constructor and Description |
|---|
MiniMaxPlayer.Leaf(GameState gs,
MiniMaxPlayer.Node previous)
construct a new leaf
|


IHTSDO
IHTSDO
PATTERN ASSET LIBRARY
Splendid is the trading name of How Splendid Ltd: Registered in England No 04692212.
This resource provides the guidelines and information required to create great and consistent IHTSDO interfaces. Each page is a pattern-type and provides written description overviews in consistent sections:
'What is this?'; 'Behaviour'; 'How and when to use', 'Examples'; and in cases where necessary, 'Considerations'. There is a small table of Page Use examples, which identifies current IHTSDO pages the pattern might be used for, including some proposals.
Examples are also provided (frequently annotated). Wireframes are typically interactive to demonstrate the behaviour and in some cases it's possible to toggle the view between the wireframe and design.
Pattern Library Index


We’re partnering with NGOs as they fight child malnutrition internationally.
Be part of this community and help the children of our future!
The 25 countries with the higher percentage of malnutrition:
The main causes are unsafe water, inadequate sanitation or insufficient hygiene, factors related to society and poverty, diseases, maternal factors, gender issues and – overall – poverty.
Undernutrition in children causes direct structural damage to the brain and impairs infant motor development and exploratory behavior.[9] Children who are undernourished before age two and gain weight quickly later in childhood and in adolescence are at high risk of chronic diseases related to nutrition.
By using Malo Tracker you'll be helping organizations around the world with your data, having a clearer view and organize the best strategies to fight against children malnutrition.
Be one of them!


{% load otree_tags staticfiles %}
In this study, you will be randomly and anonymously paired with another participant. Each of you simultaneously and privately chooses between "A" and "B" by clicking the appropriate choice. Your payoffs will be determined by the choices of both as below:
In each cell, the amount (in points) to the left is the payoff for you and to the right for the other participant.
| The Other Participant | |||
|---|---|---|---|
| A | B | ||
| You | A | {{ Constants.my_A_A_payoff }}, {{ Constants.other_A_A_payoff }} | {{ Constants.my_A_B_payoff }}, {{ Constants.other_A_B_payoff }} |
| B | {{ Constants.my_B_A_payoff }}, {{ Constants.other_B_A_payoff }} | {{ Constants.my_B_B_payoff }}, {{ Constants.other_B_B_payoff }} |


MAD CITY (Warner Bros.) Starring: Dustin Hoffman, John Travolta, Alan Alda, Mia Kirshner, Ted Levine, Robert Prosky, Blythe Danner. Screenplay: Tom Matthews. Producers: Arnold Kopelson and Anne Kopelson. Director: Costa-Gavras. MPAA Rating: PG-13 (profanity, adult themes, violence) Running Time: 100 minutes. Reviewed by Scott Renshaw.
In Costa-Gavras' new drama MAD CITY, reporter Max Brackett (Dustin Hoffman) stumbles onto the story of a lifetime exactly when his career needs it most -- and his soul needs it least. Once a network news star, Brackett has been serving time in the journalistic gulag of Madeline, California since insulting anchorman Kevin Hollander (Alan Alda) on the air. While doing a puff piece at a local museum, Brackett finds himself staring at his return ticket to the big time when laid-off security guard Sam Baily (John Travolta) storms the place with a gun to demand his job back, then inadvertently shoots another guard and ends up taking a group of school children hostage. Sam wants nothing more than to get out alive; Brackett sees a chance to guide the story by becoming ringmaster of the ensuing media circus as Sam's mouthpiece and de facto press secretary.
Twenty years ago, a film like MAD CITY would have been a provocative and disturbing exploration of how television news can exploit a story to feed our blood-lust. In fact, it was...it was called NETWORK. Paddy Chayefsky's brilliant script and Peter Finch's mesmerizing final performance as unraveling anchorman Howard Beale made NETWORK a classic of dark satire, spotlighting the natural culmination of an obsessive pursuit of ratings.
MAD CITY arrives in a different era. The notion that televison news isn't just about the news...well, it just isn't news. It never manages to arouse much more than nods of recognition, because the images and situations are familiar to the point of cliche: Alda's self-important anchorman, the selective editing of a story to fit a pre-determined agenda, the absurdity of a growing media feeding frenzy. As an ethics lesson, it's strident but ineffective, preaching to a nation of converts about a problem they all know exists but have no idea how to correct.
It's fortunate, then, that MAD CITY does a solid job of giving its subject a human face. That face doesn't belong to Dustin Hoffman, though Brackett is the story's central character. Watching his developing crisis of conscience -- and similarly the conversion of Brackett's naive assistant (Mia Kirshner) into a cutthroat reporter -- becomes a chore as the script slogs toward the inevitable. No, it is John Travolta who creates the most vivid portrait in MAD CITY as a man overwhelmed by circumstances before he has any idea what they are. Playing simple challenges any actor, yet Travolta plays simple with a disarming effectiveness. His trust that Brackett will act in his best interest is wonderfully misguided; his incredulous expressions as Brackett takes over an interview with Larry King capture the realization that the media's best interests are always their own. Sam Baily acts as a stand-in for everyone who sees the media going berzerk over things they barely comprehend.
The relationship moments between Baily and Brackett are among the strongest in MAD CITY, though it also provides a few chuckles as the public sympathies sway in the breeze. Like most "message" films, however, it begins to wilt every time it underlines its message. MAD CITY's primary stumbling block is its obviousness -- of the character developments, of the plot progression, of the scolding tone the film takes towards its targets. It reaches an audience which doesn't find sensationalism disturbing, but it delivers its story as though no one else had told it before. That's two places NETWORK was prescient: telling the story of media gone mad, and anticipating viewers who would come to find the madness tolerable.
On the Renshaw scale of 0 to 10 media blitzes: 6.
Visit Scott Renshaw's MoviePage http://www.inconnect.com/~renshaw/ *** Subscribe to receive new reviews directly by email! See the MoviePage for details, or reply to this message with subject line "Subscribe".
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


Dungeon Escape
Allocate Your Stats!
You have 3 points to spend how you like.
CURRENT STATS
Hit Points:
Mana Points:
Attack Power:
Spell Power:
Hit Points
Mana Points
Attack Power
Spell Power
Available Points


--- type: card title: Flippable card usage: A compact and interactive way of displaying content stylesheet: '/scss/components/flippable.scss' ---


I graduated highschool in 2018, and I am enrolled at AUCA in IT faculty; Software Engineering department. I am currently doing the Wecode training program in order to become a web developer.
I decided to take programming classes because I love programmming and I want to work as a web developer.
My hobbies include; reading, writing and music.
As of now I have basic skills in HTML, CSS and Javascript.
If you would like to check out some of the projects I have already worked on here are some links below:
This is the first one I worked on using HTML and CSS, it is a simple website https://github.com/Missy-Olivia/custom-project1
This one is also written using HTML and CSS for styling, It is a tourism website https://github.com/Missy-Olivia/tembea-africa


Weak (variational) formulation of Navier-Stokes equation
14 Nov 2022Computational Fluid Dynamics (CFD) is the field of studying the dynamics of fluid flow using mathematical and computational methods. The fluid flow is usually expressed in the form of Navier-Stokes or Stokes equations, on which appropriate numerical schemes are applied, and the derived system of equations is solved using computers, resulting in the prediction of flow patterns and secondary entities like the shear stress.
The concept of the weak formulation needed for solving partial differential equations (PDEs) numerically using the finite element method was already discussed here. In this post, we have a look at how to derive the weak form of the Navier-Stokes equations, which can be used in available open-source PDE solvers (like FreeFEM, FEniCS, and deal.ii) to simulate fluid flow in any desired domain.
In its general form, the Navier-Stokes equations describing the flow of an incompressible fluid with constant density in the domain (with being the dimension, so 2 or 3) can be written as :
in which is the fluid velocity, is the pressure (which is actually pressure divided by the density), is the kinematic viscosity (with being the dynamic viscosity), and is a force term. The equations are conservation of linear momentum and conservation of mass (also called continuity equation), respectively. When is constant, the diffusion term can be simplified as:
which turns the general form into the following:
This equation satisfies the incompressibility condition and needs proper initial and boundary conditions to be well-posed. The initial condition can be defined as:
where is a divergence-free velocity field. Various types of boundary conditions can be applied. For example, if is the boundary of , it can be split into 3 distinct boundaries each of which with a different type. On , the inlet can be defined as a Dirichlet boundary condition for the velocity for a given velocity profile :
On , a wall boundary no-slip condition can be considered:
On , for the outlet condition, a homogeneous Neumann condition on velocity and a zero pressure condition can be defined like:
with being the normal direction on the boundary . Broadly speaking, these boundaries can be grouped into 2 sets: and for boundaries with Dirichlet and Neumann conditions, respectively.
The Navier-Stokes equations can be written componentwise for individual components of the flow vector field in the Cartesian coordinates. Denoting (with in 2D and in 3D), the equation can be presented as:
For deriving the weak formulation, the first equation of the Navier-Stokes is multiplied by a test function defined on a proper function space V in which the test functions vanish on the Dirichlet boundary:
yielding to:
Applying Green’s divergence theory results in:
and
Substituting these two equation into the first equation yields to:
The last term of this equation is expressed in accordance to the defined Neumann boundary condition, which vanishes on due to the defined condition. Moreover, this term vanishes on the Dirichlet boundaries due to the properties of the function space .
Similarly, the second equation of the Navier-Stokes is multiplied by a test function belonging to the function space , called the pressure space:
resulting in:
The last 2 equations are so called weak (variational) forms of the Navier-Stokes equations.


--- layout: page title: About description: Web Novel Translations background: '/img/bg-about.jpg' ---
I fell in love with the amazingly drawn manga adaptation and proceeded to read the novel. It seems like the last translation group for the novel has quietly dropped the series, with their last release at Chapter 18, which is now behind the manga, so I've decided to pick this up. Luna has graciously picked this up and will be releasing up to Ch.36, so I'll be moving onto Book 2!
I'm not a good translator by any means, in fact, this is the first series I'm doing, so feel free to give feedbacks on improvements and changes. And if you wish to pick up the translation for this series, just let me know!
If you're coming from the manga, I would like to point out that there's some notable differences between the manga and the novel, some are for the better, others not so. But I'll leave it up to you to decide which is which!
Please support the authors by buying the books and/or reading them on official sites!
Eric has had a hard life. At the age of 16, his village was overrun by monsters, who killed his family and friends. He soon became a soldier, but failed to save the life of the woman he loved. In the end, he died on the battlefield, surrounded by the bodies of those who he couldn’t protect.
When Eric wakes up, he finds himself in a baby’s body. Realizing he has been reincarnated, he quickly wonders what is going on before he gets another shocker: the man and woman who are raising him are in fact his previous life’s parents!
That’s right - Eric was reincarnated, but as himself. No alternate worlds, no skill trees, just his memories sent back to the moment he popped out of his mother. Armed with the knowledge of his past self, Eric vows to save everyone now that the universe has pushed the reset button for him.


Update from 3.0.0 to 3.0.1
Estimated service maintenance break for upgrading 3.0.0 to 3.0.1 is about 15 minutes.
Purpose of this upgrade
Tellu Skin 3.0.1 requires server version 3.0.1, so you need to upgrade both, the server package and the Skin.
Upgrading the servers
First, stop running servers and back up your existing server configuration files, you need them later. Use method like this for example:
$ /etc/init.d/tellu.init.d stop $ cd PREFIX/etc/ $ mv tellud.conf tellud.conf.300 $ mv telmond.conf telmond.conf.300 $ mv telskind.conf telskind.conf.300
Now compile and install new server package as you did when you installed Tellu servers for first time. See compiling instructions here. All you have to do is to compile and install new servers in place, do not reinitialize the database. After succesful installation, review new configuration files in `PREFIX/etc' and change them to suit your environment, use old configuration files as a reference. Then, start new servers and proceed to upgrading the Skin.
Upgrading the Skin
Install new Skin as described here. It is not absolutely necessary to back up old Skin installation first (although it is highly recommended), you can install new Skin overwriting the old one.


Google Chrome is getting a new tab switcher – and it's a bit of a mess
by Cat EllisGoogle Chrome is getting a new tab switcher – and it's a bit of a mess
There's a lot going on...
Chrome's old tab switcher on the left, with large cards, and the redesigned switcher on the right (Image credit: Google)
Google is testing an update for Chrome that might prove controversial: a new tab switcher that's packed with extra icons and options, eschewing the old minimalist look.
Rather than simply showing a set of large 'cards' that you can swipe through to choose the tab you want, the new design presents you with (take a deep breath) the Google logo front and center, an Incognito mode toggle, a set of links to recently visited sites, a search bar (complete with voice search option), an options menu, and a button for creating new tabs.
- How to enable dark mode for Google Chrome
- How to enable dark mode for Facebook
- We've rounded up the best browsers of 2019
The 'cards' for your current tabs have been replaced by much smaller tiles, similar to those used by Firefox.
The overall effect is rather crowded, with the Incognito toggle seeming like a particularly unusual addition, crammed right beside the Google logo.
Try it now
The new design is still in an experimental stage, and it's not clear when it might roll out to the release version of Chrome, but it's available to try now in both the Canary and Dev versions for Android.
As Android Police explains, whether the new tab switcher appears is rather hit-and-miss. It might appear by default the first time you try it, or you might need to visit chrome://flags and search for 'enable tab grid layout'. Change this flag's setting to 'Enabled' and re-launch the browser.


Voucher Code Custom Activity
First Name
Last Name
Email Address
Phone Number
Age
Date of Birth
Is Married?


jqScheduler for PHP comes with a lot of predefined language packs. They are located in the installation package, in the /php/localization folder. Language packs are in the form of php files, containing definitions for all strings in the schedule that can be localized - this includes messages, captions, search/add/delete dialog labels, etc.
In order to use a particular language pack, you need to use the PHP method setLocale($lang_pack) wher the $lang_pack is 5 letter code where the first two letter represent the language and the lastr two letter represent the Country. The example below set the Bulgarian language pack.
... ... $eventcal = new jqScheduler($conn); $eventcal->setLocale('bg_BG'); ...
By defaulr a English language pack is used. In this case it is not needed to use setLocale method.


|
Face Gestures API
|
Public Member Functions | |
| void | Push (const std::string &name, const std::string &config) |
| void | Run (void) |
Static Public Member Functions | |
| static AlgorithmFactory * | GetInstance (void) |
Private Types | |
| typedef tbb::flow::continue_msg | MessageType |
|
typedef tbb::flow::broadcast_node < MessageType > | BroadcastNode |
|
typedef tbb::flow::continue_node < MessageType > | ContinueNode |
Private Member Functions | |
| void | Release (void) |
Private Attributes | |
| tbb::flow::graph | graph_ |
| BroadcastNode * | broadcastNode_ |
| std::vector< ContinueNode * > | continueNodes_ |
Static Private Attributes | |
| static AlgorithmFactory * | instance_ = NULL |
| static tbb::mutex | mutex_ |
Definition at line 17 of file AlgorithmFactory.h.


--- layout: archive title: Zulip Chat Archive permalink: /stream/187764-Lean-for-teaching/topic/format_lean.html ---
In format_lean I added the possibility to use tikzcd diagrams, and also include theorems without a Lean counterpart. This is used in https://www.math.u-psud.fr/~pmassot/enseignement/math114/cours5.html There is a diagram at the very bottom of the page for instance. Note that this page also feature a proof of existence of quotient.lift
by hand for discussion purpose (this is actually the only Lean proof of that page).
@Mohammad Pedramfar I had no time to look at your interactive version yet, because I have too much teaching, administration, referee reports, perfectoid spaces etc. But you can PR it in order to avoid drifting too far away from my version.
{% endraw %}Last updated: Apr 24 2020 at 19:02 UTC


Use Scala IDE bundle or add Scala IDE plugin to your existing Eclipse installation.
Scala IDE is Eclipse bundle with Scala and Maven support out of the box.
Play! Framework project must be a Scala project (must have Scala nature) in Eclipse. For Eclipse project to be Scala project it has to be Java project first.
M2Eclipse (Eclipse plugin for Maven integration) analyzes Maven project and treats it as a Java project only if it has maven-compiler-plugin with default-compile and default-testCompile executions in it’s build.
This condition is met for jar, war, ejb and some other packagings, but not for play2 because play2 projects use sbt-compiler-maven-plugin instead of maven-compiler-plugin.
In order to make M2Eclipse properly import and configure play2 project, fake maven-compiler-plugin plugin configuration has to be added. It should be done in separate profile, used only inside Eclipse.
There is one more problem with Eclipse integration. Using the same classes location (target/classes) by Eclipse and Maven (or SBT) from command line at the same time leads to problems. Scala IDE uses .cache-main file for storing incremental compilation informations. Maven uses target/cache/compile file. Using different control files by different Scala compilers for the same source and target locations simultaniously or alternately causes problems. The solution is to define different output directory for Eclipse.
Additionally, source and target compilation parameters in maven-compiler-plugin are used to set source and generated .class files compatibility levels in Java Compiler page of project properties.
Necessary pom.xml code snipped with eclipse profile is presented below:
<profiles> <profile> <id>eclipse</id> <build> <directory>${project.basedir}/target-eclipse</directory> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <skipMain>true</skipMain> <skip>true</skip> <source>1.6</source> <!-- 1.8 for Play! 2.5+ --> <target>1.6</target> <!-- 1.8 for Play! 2.5+ --> </configuration> <executions> <execution> <id>default-compile</id> <goals><goal>compile</goal></goals> </execution> <execution> <id>default-testCompile</id> <goals><goal>testCompile</goal></goals> </execution> </executions> </plugin> </plugins> </build> </profile> </profiles>
This profile is intended to be used exclusively by Eclipse. Don’t use it when building with Maven from command line.
Click Next button.
Click Finish button.
When import process finishes, the project looks like on the image below.
As you can see, there are many compilation errors. The project is treated as any other Java project. Eclipse Java Compiler (JDT) cannot compile Scala code and fails with huge amount of compilation errors.
Now Java project has to be converted into a Scala project. This is accomplished by adding Scala Nature to it.
After adding Scala Nature, Eclipse recompiles the project.
There are no errors in the project anymore.
On the above picture you can see routes and templates files generated by the plugin in target-eclipse/routes/main and target-eclipse/twirl/main directories.


|
|||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Object javax.swing.table.AbstractTableModel mars.tools.BHTableModel
public class BHTableModel
Simulates the actual functionality of a Branch History Table (BHT).
The BHT consists of a number of BHT entries which are used to perform branch prediction. The entries of the BHT are stored as a Vector of BHTEntry objects. The number of entries is configurable but has to be a power of 2. The history kept by each BHT entry is also configurable during run-time. A change of the configuration however causes a complete reset of the BHT.
The typical interaction is as follows:
getIdxForAddress(int)
method.getPredictionAtIdx(int)
method.updatePredictionAtIdx(int, boolean)
method.Additionally it serves as TableModel that can be directly used to render the state of the BHT in a JTable. Feedback provided to the BHT causes a change of the internal state and a repaint of the table(s) associated to this model.
| Field Summary |
|---|
| Fields inherited from class javax.swing.table.AbstractTableModel |
|---|
listenerList |
| Constructor Summary | |
|---|---|
BHTableModel(int numEntries,
int historySize,
boolean initVal)
Constructs a new BHT with given number of entries and history size. |
| Method Summary | |
|---|---|
java.lang.Class |
getColumnClass(int i)
Returns the class/type of the i-th column of the table. |
int |
getColumnCount()
Returns the number of columns. |
java.lang.String |
getColumnName(int i)
Returns the name of the i-th column of the table. |
int |
getIdxForAddress(int address)
Returns the index into the BHT for a given branch instruction address. |
boolean |
getPredictionAtIdx(int index)
Retrieve the prediction for the i-th BHT entry. |
int |
getRowCount()
Returns the number of entries of the BHT. |
java.lang.Object |
getValueAt(int row,
int col)
Returns the value of the cell at the given row and column Required by the TableModel interface. |
void |
initBHT(int numEntries,
int historySize,
boolean initVal)
Initializes the BHT with the given size and history. |
void |
updatePredictionAtIdx(int index,
boolean branchTaken)
Updates the BHT entry with the outcome of the branch instruction. |
| Methods inherited from class javax.swing.table.AbstractTableModel |
|---|
addTableModelListener, findColumn, fireTableCellUpdated, fireTableChanged, fireTableDataChanged, fireTableRowsDeleted, fireTableRowsInserted, fireTableRowsUpdated, fireTableStructureChanged, getListeners, getTableModelListeners, isCellEditable, removeTableModelListener, setValueAt |
| Methods inherited from class java.lang.Object |
|---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
| Constructor Detail |
|---|
public BHTableModel(int numEntries, int historySize, boolean initVal)
numEntries
- number of entries in the BHThistorySize
- size of the history (in bits/number of past branches)| Method Detail |
|---|
public java.lang.String getColumnName(int i)
getColumnName
in interface javax.swing.table.TableModel
getColumnName
in class javax.swing.table.AbstractTableModel
i
- the index of the column
public java.lang.Class getColumnClass(int i)
getColumnClass
in interface javax.swing.table.TableModel
getColumnClass
in class javax.swing.table.AbstractTableModel
i
- the index of the column
public int getColumnCount()
public int getRowCount()
public java.lang.Object getValueAt(int row, int col)
row
- the row indexcol
- the column index
public void initBHT(int numEntries, int historySize, boolean initVal)
numEntries
- number of entries in the BHT (has to be a power of 2)historySize
- size of the history to considerinitVal
- initial value for each entry (true means take branch, false do not take branch)public int getIdxForAddress(int address)
address
- the address of the branch instruction
public boolean getPredictionAtIdx(int index)
index
- the index of the entry in the BHT
public void updatePredictionAtIdx(int index, boolean branchTaken)
index
- the index of the entry in the BHTbranchTaken
-
|
|||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |


** Copyright (c) 2006, Oliver Schoenborn ** Distributed under the BSD Software License (see accompanying ** LICENSE_IOF_1_0.txt in root folder of library for complete ** terms and conditions).
#include "output.hpp"
#include "input.hpp"
Include dependency graph for io.hpp:
Go to the source code of this file.


class: center, middle, inverse, title-slide # Analysis of RNA-seq data in R and Bioconductor
###
http://rockefelleruniversity.github.io/RU_RNAseq/
--- ## The data. In this session we will be reviewing data from Christina Leslie's lab at MSKCC on T-Reg cells and activated T-Reg cells. T-Reg data can be found on the Encode portal [here](https://www.encodeproject.org/experiments/ENCSR486LMB/) and activated T-Reg data [here](https://www.encodeproject.org/experiments/ENCSR726DNP/) I have aligned all FQ to BAM and counted in genes and exons using Rsubread and summariseOverlaps(). I have also quantified our transcripts from FQ files using our transcript fasta from last session and Salmon. --- ## The data. All Gene and Exon counts can be found as .RData obects in **Data** directory - Counts in genes can be found at - **Data/GeneCounts.RData** - Counts in disjoint exons can be found at - **Data/ExonCounts.RData** - Salmon transcript quantification output directories can be found under - **Data/Salmon/** --- ## What we will cover. In our last session we will looked at two separate ways we can gain gene expression estimates from raw sequencing data as fastQ files. In this session we will import our expression estimates to identify differences in the expression of genes between conditions. --- ## Counts from SummariseOverlaps In our last session we counted our reads in genes using the summarise overlaps function to generate our **RangedSummarizedExperiment** object. I have counted using a **BamFileList** of all T-Reg samples to easily organise my samples and save memory with the **yieldSize** parameter. ```r library(Rsamtools) bamFilesToCount <- c("Sorted_Treg_1.bam","Sorted_Treg_2.bam", "Sorted_Treg_act_1.bam","Sorted_Treg_act_2.bam", "Sorted_Treg_act_3.bam") names(bamFilesToCount) <- c("Sorted_Treg_1","Sorted_Treg_2", "Sorted_Treg_act_1","Sorted_Treg_act_2", "Sorted_Treg_act_3") myBams <- BamFileList(bamFilesToCount,yieldSize = 10000) ``` --- ## Counts from SummariseOverlaps With this BamFileList I can count as we did a single sample to produce our **RangedSummarizedExperiment** object of counts in genes across all samples. ```r library(TxDb.Mmusculus.UCSC.mm10.knownGene) library(GenomicAlignments) geneExons <- exonsBy(TxDb.Mmusculus.UCSC.mm10.knownGene,by="gene") geneCounts <- summarizeOverlaps(geneExons,myBams, ignore.strand = TRUE) geneCounts ``` ``` ## class: RangedSummarizedExperiment ## dim: 24100 5 ## metadata(0): ## assays(1): '' ## rownames(24100):<PHONE_NUMBER>8 ... 100040911 170942 ## rowData names(0): ## colnames(5): Sorted_T_reg_1 Sorted_T_reg_2 Sorted_T_reg_act_1 ## Sorted_T_reg_act_2 Sorted_T_reg_act_3 ## colData names(0): ``` --- ## Speeding up SummariseOverlaps Bioconductor has a simple, unified system for parallisation through the **BiocParallel** package. The BiocParallel package allows for differing parallel approachs including multiple cores on the same machine and distributed computing across large cluster environments. Simply by installing and loading library, we are ready for parallelisation. ```r library(BiocParallel) ``` --- ## Speeding up SummariseOverlaps We can control the parallisation in BiocParallel often choosing either a serial mode (no parallisation) with **SerialParam()** function or the number of cores to use with **MulticoreParam(workers=NUMBEROFCORES)**. We use the **register()** function to set the desired parallelisation. ```r paramMulti <- MulticoreParam(workers=2) paramSerial <- SerialParam() register(paramSerial) ``` --- ## Counts from SummariseOverlaps Our **RangedSummarizedExperiment** contains our counts as a matrix accessible by the **assay()** function. Each row is named by its Entrez gene ID. ```r assay(geneCounts)[1:2,] ``` ``` ## Sorted_T_reg_1 Sorted_T_reg_2 Sorted_T_reg_act_1 Sorted_T_reg_act_2 ## 497097 0 1 0 0 ## 19888 0 0 0 0 ## Sorted_T_reg_act_3 ## 497097 0 ## 19888 11 ``` --- ## Counts from SummariseOverlaps We can retrieve the GRangesList we counted by the **rowRanges()** accessor function. Each GRangesList element contains exons used in counting, has Entrez gene ID and is in matching order as rows in our count table. ```r rowRanges(geneCounts)[1:2,] ``` ``` ## GRangesList object of length 2: ## $497097 ## GRanges object with 3 ranges and 2 metadata columns: ## seqnames ranges strand | exon_id exon_name ## <Rle> <IRanges> <Rle> | <integer> <character> ## [1] chr1 [3214482, 3216968] - | 8008 <NA> ## [2] chr1 [3421702, 3421901] - | 8009 <NA> ## [3] chr1 [3670552, 3671498] - | 8012 <NA> ## ## $19888 ## GRanges object with 6 ranges and 2 metadata columns: ## seqnames ranges strand | exon_id exon_name ## [1] chr1 [4290846, 4293012] - | 8013 <NA> ## [2] chr1 [4343507, 4350091] - | 8014 <NA> ## [3] chr1 [4351910, 4352081] - | 8015 <NA> ## [4] chr1 [4352202, 4352837] - | 8016 <NA> ## [5] chr1 [4360200, 4360314] - | 8017 <NA> ## [6] chr1 [4409170, 4409241] - | 8018 <NA> ## ## ------- ## seqinfo: 66 sequences (1 circular) from mm10 genome ``` --- ## Differential expression from RNAseq data. To perform differential expression between our sample groups we will need to perform some essential steps. - Transform and/or Normalise our counts. - Calculate significance of differences between groups from normalised/transformed counts. --- ## Log transform or as counts. Two broadly different approaches to RNAseq analysis could be. - Log2 transform, normalise, use standard test for normal distribution to find differential expression. - Normalise and use test suitable for count data to find differential expression. --- ## Normalisation. As with microarrays, for the majority of normalisations we assume that the composition of RNA species across samples is similar and total RNA levels as the same. To account for technical differences in library composition, many of these approached identify scaling factors for each sample which may be used to normalised observed/measured counts. Simple measures such as reads per million (RPM) are scaled to total mapped reads whereas more sophisticated methods, such as used in DESeq2 find scaling factors from the distribution of genes relative log expression versus their respective average across all samples. .pull-left[

 ] .pull-right[

 ] --- ## Mean and variance relationship. Most approaches seek to model the relationship between mean expression and variance of expression in order to model and shrink variance of individual genes. This will assist us to detect differential expression with a small number of replicates. ![](imgs/meanVariance.png) --- ## DESeq2 Options for differential expression analysis in RNA-seq data are available in R including DESeq2, EdgeR and Voom/Limma. Both EdgeR and DESeq2 works with non-transformed count data to detect differential expression. Voom transforms count data into log2 values with associated mean dependent weighting for use in Limma differential expression functions. We will use the DESeq2 software to identify differential expression. --- ## DESeq2 To use DESeq2 we must first produce a dataframe of our Sample groups. ```r metaData <- data.frame(Group=c("Naive","Naive","Act","Act","Act"), row.names = colnames(geneCounts)) metaData ``` ``` ## Group ## Sorted_T_reg_1 Naive ## Sorted_T_reg_2 Naive ## Sorted_T_reg_act_1 Act ## Sorted_T_reg_act_2 Act ## Sorted_T_reg_act_3 Act ``` --- ## DESeq2 Previously we have been using **DESeqDataSetFromMatrix()** constructor. We must provide the counts matrix, our metadata dataframe, our design specifying with metadata columns to test and a GRanges we counted on. ```r countMatrix <- assay(geneCounts) countGRanges <- rowRanges(geneCounts) dds <- DESeqDataSetFromMatrix(countMatrix, colData = metaData, design = ~Group, rowRanges=countGRanges) dds ``` ``` ## class: DESeqDataSet ## dim: 24100 5 ## metadata(1): version ## assays(1): counts ## rownames(24100):<PHONE_NUMBER>8 ... 100040911 170942 ## rowData names(0): ## colnames(5): Sorted_T_reg_1 Sorted_T_reg_2 Sorted_T_reg_act_1 ## Sorted_T_reg_act_2 Sorted_T_reg_act_3 ## colData names(1): Group ``` --- ## DESeq2 Alternative, can first update our **RangedSummarizedExperiment** object to include our metadata using the **colData** accessor. ```r colData(geneCounts)$Group <- metaData$Group geneCounts ``` ``` ## class: RangedSummarizedExperiment ## dim: 24100 5 ## metadata(0): ## assays(1): '' ## rownames(24100):<PHONE_NUMBER>8 ... 100040911 170942 ## rowData names(0): ## colnames(5): Sorted_T_reg_1 Sorted_T_reg_2 Sorted_T_reg_act_1 ## Sorted_T_reg_act_2 Sorted_T_reg_act_3 ## colData names(1): Group ``` --- ## DESeq2 Now we can make use of the **DESeqDataSet()** function to build directly from our **RangedSummarizedExperiment** object. We simply have to specify the **design** parameter to specify metadata column to test on. ```r dds <- DESeqDataSet(geneCounts,design = ~Group) ``` ``` ## renaming the first element in assays to 'counts' ``` ```r dds ``` ``` ## class: DESeqDataSet ## dim: 24100 5 ## metadata(1): version ## assays(1): counts ## rownames(24100):<PHONE_NUMBER>8 ... 100040911 170942 ## rowData names(0): ## colnames(5): Sorted_T_reg_1 Sorted_T_reg_2 Sorted_T_reg_act_1 ## Sorted_T_reg_act_2 Sorted_T_reg_act_3 ## colData names(1): Group ``` --- ## DESeq function We have previously used the **DEseq()** workflow function to normalise library sizes, estimate and shrink variance and test our data in a single step. ```r dds <- DESeq(dds) ``` ``` ## estimating size factors ``` ``` ## estimating dispersions ``` ``` ## gene-wise dispersion estimates ``` ``` ## mean-dispersion relationship ``` ``` ## final dispersion estimates ``` ``` ## fitting model and testing ``` --- ## DESeq function In its first step the **DEseq()** function normalises our data by evaluating the median expression of genes across all samples to produce a per sample normalisation factor (library size). We can retrieve normalised and unnormalised values from our DESeq2 object using the **counts()** function and specifying the **normalized** parameter as TRUE. Normalised counts are counts divided by the library scaling factor. ```r normCounts <- counts(dds,normalized=TRUE) normCounts[1:2,] ``` ``` ## Sorted_T_reg_1 Sorted_T_reg_2 Sorted_T_reg_act_1 Sorted_T_reg_act_2 ## 497097 0 0.9202987 0 0 ## 19888 0 0.0000000 0 0 ## Sorted_T_reg_act_3 ## 497097 0.00000 ## 19888 10.12247 ``` --- ## DESeq function In the second step the **DEseq()** function estimates variances and importantly shrinks variance depending on the mean. This shrinking of variance allows us to detect significant changes with low replicate number. We can review the Variance/mean relationship and shrinkage using **plotDispEsts()** function and our **DESeq2** object. We can see the **adjusted dispersions in blue** and **original dispersion for genes in black**. ```r plotDispEsts(dds) ``` ![](RU_RNAseq_p_2_files/figure-html/de6-1.png) --- ## DESeq results Finally we can extract our contrast of interest using the **results()** function. We must specify the **contrast** parameter, listing the metadata column of interest and the two groups to compare. The resulting **DESeqResults** can be sorted by pvalue to list most significant changes at top of table. ```r myRes <-results(dds,contrast = c("Group","Act","Naive")) myRes <- myRes[order(myRes$pvalue),] myRes[1:3,] ``` ``` ## log2 fold change (MLE): Group Act vs Naive ## Wald test p-value: Group Act vs Naive ## DataFrame with 3 rows and 6 columns ## baseMean log2FoldChange lfcSE stat pvalue padj ## <numeric> <numeric> <numeric> <numeric> <numeric> <numeric> ## 54167 20595.525 2.224160 0.05133798 43.32388 0 0 ## 20198 4896.288 3.417348 0.07823816 43.67879 0 0 ## 20200 6444.617 3.196367 0.07482242 42.71938 0 0 ``` --- ## DESeqResults objects The **DESeqReults** object contains important information from our differential expression testing. - **baseMean** - Mean normalised values across all samples. - **log2FoldChange** - Log2 of fold change between groups being compared. - **pvalue** - Significance of change between groups. - **padj** - Significance of change between groups corrected for multiple testing. --- ## DESeqResults objects With our DESeqResults object We can get a very quick overview of differential expression changes using the **summary** function. ```r summary(myRes) ``` ``` ## ## out of 19776 with nonzero total read count ## adjusted p-value < 0.1 ## LFC > 0 (up) : 2819, 14% ## LFC < 0 (down) : 2373, 12% ## outliers [1] : 0, 0% ## low counts [2] : 6443, 33% ## (mean count < 6) ## [1] see 'cooksCutoff' argument of ?results ## [2] see 'independentFiltering' argument of ?results ``` --- ## DESeqResults objects We can review the relationship between fold-changes and expression levels with a MA-Plot by using the **plotMA()** function and our DESeqResults object. ```r plotMA(myRes) ``` ![](RU_RNAseq_p_2_files/figure-html/dr1a-1.png) --- ## DESeqResults objects We downweight genes with high fold change but low significance (due to low counts/high dispersion) by using the **lfcShrink()** function as we have the **results()** function. This allows us to now use the log2FC as a measure of significance of change in our ranking for analysis and in programs such as **GSEA**. ```r myRes <-results(dds,contrast = c("Group","Act","Naive")) myRes$log2FoldChange <- lfcShrink(dds,contrast = c("Group","Act","Naive")) plotMA(myRes) ``` ![](RU_RNAseq_p_2_files/figure-html/dr1b-1.png) --- ## DESeqResults objects We can also convert our DESeqResults objects into a standard data frame using the **as.data.frame** function. ```r myResAsDF <- as.data.frame(myRes) myResAsDF[1:2,] ``` ``` ## baseMean log2FoldChange lfcSE stat pvalue padj ## 497097 0.1840597 -1.353988 4.558285 -0.2970389 0.7664368 NA ## 19888 2.0244933 4.254712 3.557586 1.1959549 0.2317142 NA ``` --- ## Multiple testing .pull-left[ In our analysis we are testing 1000s of genes and identifing significance of each gene separately at a set confidence interval. If we are 95% confident a gene is differentially expressed when we look at all genes we can expect 5% to be false. When looking across all genes we apply a multiple testing correction to account for this. ] .pull-right[

 ] --- ## Multiple testing We could apply a multiple testing to our p-values ourselves using either the Bonferroni or Benjamini-Hockberg correction. - Bonferonni = (p-value of gene)*(Total genes tested) - Benjamini-Hockberg = ((p-value of gene)*(Total genes tested))/(rank of p-value of gene) --- ## Multiple testing The total number of genes tested has a large effect on these multiple correction methods. Independent filtering may be applied to reduce number of genes tested such as removing genes with low expression and/or variance. **We can not simply filter to differentially expressed genes and reapply correction** --- ## DESeqResults objects - NA in padj By default DEseq2 filters out low expressed genes to assist in multiple testing correction. This results in **NA** values in **padj** column for low expressed genes. ```r table(is.na(myResAsDF$padj)) ``` ``` ## ## FALSE TRUE ## 13333 10767 ``` --- ## DESeqResults objects - NA in padj We can add a column of our own adjusted p-values for all genes with a pvalue using the **p.adjust()** function. ```r myResAsDF$newPadj <- p.adjust(myResAsDF$pvalue) myResAsDF[1:3,] ``` ``` ## baseMean log2FoldChange lfcSE stat pvalue padj newPadj ## 497097 0.1840597 -1.353988 4.558285 -0.2970389 0.7664368 NA 1 ## 19888 2.0244933 4.254712 3.557586 1.1959549 0.2317142 NA 1 ## 20671 2.0122042 -3.633159 2.892215 -1.2561857 0.2090486 NA 1 ``` --- ## DESeqResults objects - NA in padj Typcially genes with **NA** padj values should be filtered from the table for later evaluation and functional testing. ```r myResAsDF <- myResAsDF[!is.na(myResAsDF$padj),] myResAsDF[1:3,] ``` ``` ## baseMean log2FoldChange lfcSE stat pvalue padj ## 27395 1935.3720 0.10189249 0.09277932 1.0982242 0.272106623 0.44505772 ## 18777 4866.0229 0.26476382 0.10264730 2.5793549 0.009898504 0.03225238 ## 21399 909.5543 0.06413133 0.12832937 0.4997401 0.617258080 0.76315857 ## newPadj ## 27395 1 ## 18777 1 ## 21399 1 ``` --- ## DESeq2 from Salmon. We saw at the end of last session how we can gain transcript quantification from fastQ using Salmon. Salmon offers a super fast alternative to alignment and counting for transcript expression estimation so we would be keen to make use of this in our differential expression analysis. To make use of Salmon transcript quantifications for differential gene expression changes we must however summarise our transcript expression estimates to gene expression estimates. --- ## Tximport The tximport package, written by same author as DESeq2, offers functions to import data from a wide range of transcript counting and quantification softwares and summarise transcript expression to genes. We can first load the Bioconductor tximport package. ```r library(tximport) ``` --- ## Tximport In order to summarise our transcripts to genes we will need to provide a data.frame of transcripts to their respective gene names. First we read in a single salmon quantification report to get a table containing all transcript names. ```r temp <- read.delim("../../Data/Salmon/T_reg_1/quant.sf") temp[1:3,] ``` ``` ## Name Length EffectiveLength TPM NumReads ## 1 uc007afg.1 2355 2106 3.45377 170.963 ## 2 uc007afh.1 2433 2184 84.73870 4349.960 ## 3 uc007afi.2 2671 2422 50.14850 2854.850 ``` --- ## Tximport We can now use the **select()** function to retrieve a transcript names (TXNAME) to gene ids (GENEID) map from our TxDb.Mmusculus.UCSC.mm10.knownGene object. Remember that available columns and keys can be found using the **columns()** and **keytype** functions respectively. ```r Tx2Gene <- select(TxDb.Mmusculus.UCSC.mm10.knownGene, keys = as.vector(temp[,1]), keytype = "TXNAME", columns = c("TXNAME","GENEID")) Tx2Gene[1:10,] ``` ``` ## TXNAME GENEID ## 1 uc007afg.1 18777 ## 2 uc007afh.1 18777 ## 3 uc007afi.2 21399 ## 4 uc011wht.1 21399 ## 5 uc011whu.1 21399 ## 6 uc007afm.2 108664 ## 7 uc007afn.2 108664 ## 8 uc057atz.1 108664 ## 9 uc007afo.2 18387 ## 10 uc057aua.1 18387 ``` --- ## Tximport Now we can use the **tximport** function to import and summarise our Salmon quantification files to gene level expression estimates. We must provide the paths to Salmon *quant.sf* files, the type of file to import (here "salmon") to **type** argument and our data.frame of transcript to gene mapping using the **tx2gene** arguement. ```r salmonQ <- dir("../../Data/Salmon/",recursive = T, pattern = "quant.sf",full.names = T) salmonCounts <- tximport(salmonQ, type="salmon", tx2gene = Tx2Gene) ``` ``` ## reading in files with read_tsv ``` ``` ## 1 2 3 4 5 ## summarizing abundance ## summarizing counts ## summarizing length ``` --- ## Tximport The result from tximport is a list containing our summarised gene expression estimates **Abundance** - Number Transcripts per million transcripts.(TPM) **Counts** - Estimated counts. ```r salmonCounts$abundance[1:2,] ``` ``` ## [,1] [,2] [,3] [,4] [,5] ## 100009600 0.04081 0.284574 0.122006 0.121766 0.141885 ## 100009609 0.00000 0.000000 0.000000 0.000000 0.000000 ``` ```r salmonCounts$counts[1:2,] ``` ``` ## [,1] [,2] [,3] [,4] [,5] ## 100009600 1.52803 10.8942 4.35698 4.58801 6.04108 ## 100009609 0.00000 0.0000 0.00000 0.00000 0.00000 ``` --- ## DESeq2 from Tximport We can now use the **DESeqDataSetFromTximport()** to build our DESeq2 object from salmon counts. We must specify the metadata to **colData** parameter and specify the column of interest in **design** parameter as we have done for **DESeqDataSetFromMatrix()**. ```r ddsSalmon <- DESeqDataSetFromTximport(salmonCounts, colData = metaData, design = ~Group) ``` ``` ## using counts and average transcript lengths from tximport ``` --- ## DESeq2 from Tximport We can then proceed as we did for previous analysis using summarizeOverlaps counts. ```r ddsSalmon <- DESeq(ddsSalmon) myResS <-results(ddsSalmon,contrast = c("Group","Act","Naive")) myResS <- myResS[order(myResS$pvalue),] myResS[1:3,] ``` ``` ## log2 fold change (MLE): Group Act vs Naive ## Wald test p-value: Group Act vs Naive ## DataFrame with 3 rows and 6 columns ## baseMean log2FoldChange lfcSE stat pvalue padj ## <numeric> <numeric> <numeric> <numeric> <numeric> <numeric> ##<PHONE_NUMBER>7.861 2.821459 0.05714341 49.37506 0 0 ## 12772 8772.359 3.988465 0.09088340 43.88551 0 0 ## 14939 6161.363 5.749023 0.10304817 55.78966 0 0 ``` --- ## Salmon and Rsubread. We can now compare the differential following Salmon quantificiation and Rsubread/summarizeOverlaps. ![](RU_RNAseq_p_2_files/figure-html/dr1ss-1.png) --- ## Annotation of results table. By whatever method we have chosen to analyse differential expression we will want to add some sensible gene names or symbols to our data frame of results. We can use the **org.db** packages to retrieve Gene Symbols for our Entrez ids using the **select** function. Here we use the **org.db** package for mouse, **org.db** ```r library(org.Mm.eg.db) eToSym <- select(org.Mm.eg.db, keys = rownames(myResAsDF), keytype = "ENTREZID", columns="SYMBOL") eToSym[1:10,] ``` ``` ## ENTREZID SYMBOL ## 1 27395 Mrpl15 ## 2 18777 Lypla1 ## 3 21399 Tcea1 ## 4 108664 Atp6v1h ## 5 12421 Rb1cc1 ## 6 319263 Pcmtd1 ## 7 71096 Sntg1 ## 8 59014 Rrs1 ## 9 76187 Adhfe1 ## 10 17864 Mybl1 ``` --- ## Annotation of results table. Now we can merge the Entrez ID to Symbol table into our table of differential expression results. ```r annotatedRes <- merge(eToSym,myResAsDF, by.x=1, by.y=0, all.x=FALSE, all.y=TRUE) annotatedRes <- annotatedRes[order(annotatedRes$pvalue),] annotatedRes[1:3,] ``` ``` ## ENTREZID SYMBOL baseMean log2FoldChange lfcSE stat pvalue ## 1027 110454 Ly6a 17468.571 2.809022 0.04994796 56.23897 0 ## 1690 12772 Ccr2 8529.015 4.011061 0.08476692 47.31871 0 ## 2339 14939 Gzmb 6260.651 5.733766 0.09678469 59.24250 0 ## padj newPadj ## 1027 0 0 ## 1690 0 0 ## 2339 0 0 ``` --- # Time for an exercise. [Link_to_exercises](../../Exercises/RNAseq_part2_exercises.html) [Link_to_answers](../../Answers/RNAseq_part2_answers.html)


Objective of the project is to reduce the gap between fresher or employee in the required skill by the company. Here we provide all category courses and trending topics like in computer science AI, Cloud computing etc. There are lots of business and startup are running at this types which is required high skill employee in all over world. So the scop of the project is cover all over world market.
In this platform we provide high ratted course and library system by which user can select best cources for learning and upskilling its skills. It reduces the gap between fresher or employee in the required skill by the company. Here we have provided the, all category courses and trending topics like in computer science AI, Cloud computing etc.
Our mission is to improve lives through learning. Our global marketplace features an extensive, multi-language library, which includes thousands of courses taught by expert instructors. You can take courses across a wide range of categories, some of which include: business & entrepreneurship, programming, academics, the arts, health & fitness, language, music and much more!


The latest model is: {{ filename }}, recorded/trained at {{ timestamp }}! If a model does exist, you can download the .mlmodel at here.


Jeff Gulbronson
github.com/JGulbronson
<EMAIL_ADDRESS>Qualifications
Experience working with Javascript, Python, Ruby, Racket and Java
Wrote a compiler for a subset of C using functional paradigms in Racket
Have contributed to open-source projects that use technologies such as Backbone.js, Angular, Flask, Node and MongoDB
Member of team who won the Microsoft Azure API challenge at Hack The North 2014, with 1000 participants
Experience
Software Engineering Intern
Seeq, Seattle
September 2015 - December 2015
Gained experience working with Flux Architecture in a large AngularJS app
Kept code readable and maintainable using functional paradigms
Open sourced a custom rule for the jscs linter. PR
here
One of 3 employees to help fork and re-release an Angular directive used throughout the app. Source
here
Software Engineering Intern
Square Inc, San Francisco
January 2015 - April 2015
Worked across teams to expose a new feature through a RESTful API
Improved an internal dashboard to help oncall employees
Gained valuable experience with test driven development, ensuring all code written is testable and maintainable
Open-source Contributor
UW Flow
April 2014 - Present
Used Backbone along with Typeahead.js, Mongo and Flask to build a unified search bar
Refactored a Python webcrawler to use an OpenData API, increasing speed and reliability
Wrote deploy-blocking Javascript tests to ensure proper parsing of schedules
Live code at
uwflow.com
Android Developer Intern
Enflick Inc
May 2014 - August 2014
Implemented international long distance calling client-side
Worked with the design team to complete a UI overhaul of the app, adding multiple themes
Ensured all features added are usable in any locale
Past Projects
Hack The North Participant
University of Waterloo
September 2014
Worked on a 3-man team to create Marvin the !Paranoid Android, a personal assistant which you could call or text
Worked on the Flask server using Wit.ai along with several other API's to implement key functionality
Won the Microsoft Azure API prize out of 15 eligible teams
Source at
github.com/axyjo/marvin


- Name
- This is the name of the category that will be visible to users.
- Description
- This is the description of the category in order to give users an idea of the applications associated with the category.
- Icon
- The icon must be 72x72 pixels and less than 800 kilobytes.


The Random Data Generator uses Brownian motion to generate the data prices. You can see how these prices and ticker strings are generated in the RandomValueGenerator class.
If you'd like to use a different system for providing the randomness you can implement your own IRandomValueGenerator
or
extend the RandomValueGenerator
class.


Serializers¶
Serialization in NumPy NPZ format¶
NumPy serializers can be used in arbitrary environments that Chainer runs with.
It consists of asymmetric serializer/deserializer due to the fact that numpy.savez()
does not support online serialization.
Therefore, serialization requires two-step manipulation: first packing the objects into a flat dictionary, and then serializing it into npz format.
-
class
chainer.serializers.
DictionarySerializer
(target=None, path='')[source]¶ Serializer for dictionary.
This is the standard serializer in Chainer. The hierarchy of objects are simply mapped to a flat dictionary with keys representing the paths to objects in the hierarchy.
Note
Despite of its name, this serializer DOES NOT serialize the object into external files. It just build a flat dictionary of arrays that can be fed into
numpy.savez()
andnumpy.savez_compressed()
. If you want to use this serializer directly, you have to manually send a resulting dictionary to one of these functions.Parameters: Variables: target (dict) – The target dictionary. Once the serialization completes, this dictionary can be fed into
numpy.savez()
ornumpy.savez_compressed()
to serialize it in the NPZ format.
-
class
chainer.serializers.
NpzDeserializer
(npz, path='')[source]¶ Deserializer for NPZ format.
This is the standard deserializer in Chainer. This deserializer can be used to read an object serialized by
save_npz()
.Parameters: - npz – npz file object.
- path – The base path that the deserialization starts from.
-
chainer.serializers.
save_npz
(filename, obj, compression=True)[source]¶ Saves an object to the file in NPZ format.
This is a short-cut function to save only one object into an NPZ file.
Parameters:
-
chainer.serializers.
load_npz
(filename, obj)[source]¶ Loads an object from the file in NPZ format.
This is a short-cut function to load from an .npz file that contains only one object.
Parameters: - filename (str) – Name of the file to be loaded.
- obj – Object to be deserialized. It must support serialization protocol.
Serialization in HDF5 format¶
-
class
chainer.serializers.
HDF5Serializer
(group, compression=4)[source]¶ Serializer for HDF5 format.
This is the standard serializer in Chainer. The chain hierarchy is simply mapped to HDF5 hierarchical groups.
Parameters: - group (h5py.Group) – The group that this serializer represents.
- compression (int) – Gzip compression level.
-
class
chainer.serializers.
HDF5Deserializer
(group)[source]¶ Deserializer for HDF5 format.
This is the standard deserializer in Chainer. This deserializer can be used to read an object serialized by
HDF5Serializer
.Parameters: group (h5py.Group) – The group that the deserialization starts from.
-
chainer.serializers.
save_hdf5
(filename, obj, compression=4)[source]¶ Saves an object to the file in HDF5 format.
This is a short-cut function to save only one object into an HDF5 file. If you want to save multiple objects to one HDF5 file, use
HDF5Serializer
directly by passing appropriateh5py.Group
objects.Parameters:
-
chainer.serializers.
load_hdf5
(filename, obj)[source]¶ Loads an object from the file in HDF5 format.
This is a short-cut function to load from an HDF5 file that contains only one object. If you want to load multiple objects from one HDF5 file, use
HDF5Deserializer
directly by passing appropriateh5py.Group
objects.Parameters: - filename (str) – Name of the file to be loaded.
- obj – Object to be deserialized. It must support serialization protocol.


About Us
The physicians and staff of ISTA Pediatrics believe that your child is a precious gift. We count it a privilege to partner with parents as they endeavor to raise healthy, happy children. We have purposed to create a warm, friendly and caring environment for your child. We are committed to providing excellent medical care in a considerate, compassionate way. As physicians, we are here to provide guidance and advice on what you can expect through the various stages of your child's growth. During your visits, we will discuss your child's physical and emotional development; and as we work together you will find that your opinions and observations are a vital part of how we approach your child's medical care. Together we can make the best decisions regarding your child's health.


Black Friday 2019: Boots Ireland offering over 50% off on perfumes, electric razors and cosmetics
The retailer is offering more than 50% off on a range of their products
by Ian ManganBlack Friday is just over a week away and retailers all over the country are slashing their prices.
With the festive season approaching Irish shoppers will be keeping a eye out to get a great bargain in the run up to Christmas.
Boots Ireland are the latest group offering punters an array of great deals on a range of products from perfumes, and cosmetics to electric razors, toothbrushes and hair straighteners.
Shoppers can get their hands on some great deals with some products on offer with more than 50% off.
Some of discounted products being offered by the retailer include:
Philips OneBlade Hybrid Trimmer with Travel Case (Sale price: €34.99, Was €69.99)
EMPORIO ARMANI She Eau de Parfum 50ml (Sale price: €28.99, Was €59.00)
Vita Liberata Mega Set - The Ultimate Bronzing Heroes (Sale price: €49.99,Was €130.00)
Ted Baker Ultimate Harmony Gift Set (Sale price: €28.00, Was €60.00)
Oral B Pro 2000 electric toothbrush (Sale price €44.99, Was €99.99)
Paco Rabanne 1 Million For Men 100ml (Sale price €44.50, Was €84.50)
Paco Rabanne 1 Million For Women 50ml (Sale price €40.00, Was €77.00)
Jack Wills Gym Bag Gift Set (Sale price: €28.00, Was €60.00)
BaByliss Bronze Shimmer 235 Straightener (Sale price:€42.99, Was €89.99)
Panasonic Nanoe Hair Dryer (Sale price: €69.99, Was €139.99)
The full range of Black Friday offers can be found by heading to the Boots Ireland website here.
How to follow the Irish Mirror on social media
You can like our main Facebook page here.
Our Irish Mirror Sports page - which brings you all your Irish and UK sports news - can be found here.
You can also check out our Irish Mirror GAA sports page.
The Irish Mirror Twitter account is @IrishMirror while our sports account is @MirrorSportIE.
Our Instagram account can be found here.


class: center, middle # Wodan ## Persistence for Mirage --- # Goals - Provide a toolkit - Tunable, efficient implementation - Integrity: fsck is not a separate utility, every loaded block has been checked - Resilience to flaky storage - Give control to the upper layers - Portability: Unix and Unikernels - Be the base building block for Mirage persistence --- # Non-goals - No DWIM: you have to know what you want - Costly operations have to be called explicitly - flushing, bulk discard never implied - No one-size-fits-all - pick a block size that fits your underlying device - pick a key size that fits your application (integers? SHA?) - No stable format: dump and restore if necessary - No POSIX compatibility: do one thing well - No types, no text, just binary values - Upsert types might be added, but so far this would be premature optimisation - Compression, chunking, deduplication, etc, all punted to upper layers --- # What we have - A good design - Log-structured, flash-friendly, resilient - Hitchhiker trees for write performance - Novel logic removing the need for a fixed root block - Some level of integrity (checksums and copy on write) - Basic benchmarking - Two compatible implementations - Both providing a library and CLI - Both fuzzed, compatible test cases - Competing on performance - An Irmin binding - Unix and Solo5 working --- # What is missing - Easy installation (upstream work) - Backing device ordering guarantees (more upstream work) - Lots of hardening - Growable stores, use thin provisioning instead - An ecosystem building on top --- # What can you do with persistence? - On-demand, short-lived, self-sufficient unikernels - Die when requests taper out, save runtime resources - Resuscitate statefully - Faster startup - No need to link data into the unikernel - Defer/remove initialisation logic - More dynamic websites, user-contributed content, wikis - On the other hand, threats may persist themselves - Provide read-only stores? (should be at the hypervisor level) --- # What can you do with a key-value store? - Content-addressed storage (similar to Git or IPFS) - All the Irmin primitives - RO: read-only - AO: append-only — content-addressed, keys derived from values - RW: updateable — hashed key to payload - Also enumerable (list of keys, expected to be small) and watchable (notify) - A key-value server, memcached / redis style --- # What can you do on top of RO/AO/RW? - The feature set of Irmin or Git - Distribution - Merging - Transactions - Sync --- # Providing a block device Currently we extend the standard Mirage signature. Stub implementations are fine, and provided. ```ocaml (let) module Block = Wodan.BlockCompat(Block) (in) ``` So far we need to add discard (only provided on Unix). For obtaining the block device, either get it through Mirage / Functoria, or use a specific backend. ```ocaml Ramdisk.connect ~name:"wodan" >>= fun disk -> ``` ```ocaml Mirage_block_unix.connect "wodan.img" >>= fun disk -> ``` --- # Configuring the store ```ocaml module Stor = Wodan.Make(Block)(struct include Wodan.StandardSuperblockParams let key_size = 20 let block_size = 256*1024 end) ``` Note: These defaults have very large fanout, and are appropriate for infrequent flushing or SSDs with large erase blocks. --- # Creating an image ```bash rm wodan.img touch wodan.img fallocate -l16M -z wodan.img wodanc format [--key-size=20] [--block-size=262144] wodan.img ``` Note: `fallocate -z` is `--zero-range`, blocks are reserved. `fallocate` without flags (`ftruncate`) or with `-p` (for `--punch-hole`) may also be used; in which case space will be allocated on first use. --- # Dumping and loading data ```bash wodanc dump wodan.img > dump.tsv wodanc restore wodan.img < dump.tsv ``` Format is TSV base64. --- # Opening the store ```ocaml Stor.prepare_io Wodan.OpenExistingDevice block Wodan.standard_mount_options >>= fun (store, gen) -> ``` with non-default options: ```ocaml {Wodan.standard_mount_options with fast_scan = fast_scan; cache_size = cache_size} ``` --- # Accessing the store ```ocaml Store.lookup store key >>= function |Some counter -> let c = Int64.of_string @@ Store.string_of_value counter in let c = Int64.succ c in Store.insert store key @@ Store.value_of_string @@ Int64.to_string c >>= fun () -> Lwt.return c | None -> Store.insert store key @@ Store.value_of_string "1" >>= fun () -> Lwt.return 1L ```
Note: string <-> key and string <-> value conversions are actually free. Serialisation isn't handled and should be provided by another library depending on your needs.
--- # Tips and tricks - Periodic flushing - Bulk loading, autoflush on ENOSPC - Flushing can free space on the disk - Setting a default value - Tombstones - Autoconfiguring module parameters from an existing superblock - Using generation numbers in distributed settings - Sparse allocation and discard - Fast scan vs full scan - Read-only hack: use the highest possible generation number to prevent flushes --- # Irmin with Wodan
*This is not as ergonomic as we'd like, and subject to change*
For tests or micro-benchmarking: ```ocaml module BlockCon = struct include Ramdisk (* from mirage-block-ramdisk *) let connect name = Ramdisk.connect ~name let discard _ _ _ = Lwt.return @@ Ok () end ``` For real persistence, use: ```ocaml module BlockCon = struct include Block (* from mirage-block-unix *) let connect name = Block.connect name end ``` --- # Irmin with Wodan (cont.) ```ocaml module DB = Wodan_irmin.DB_BUILDER (BlockCon)(Wodan.StandardSuperblockParams) ``` ```ocaml module KV = Wodan_irmin.KV_chunked (DB)(Irmin.Contents.String) (* Alternatively: Irmin.Contents.Json *) ``` Then access KV.AO, KV.RW, KV.flush, etc. ```ocaml let store_conf = Wodan_irmin.config () let repo = KV.Repo.v store_conf (* use Irmin as you normally would *) ```
--- # Irmin with Wodan and Git ```ocaml module Wodan_Git_KV = Wodan_irmin.KV_git(DB) let run () = let%lwt wodan_repo = Wodan_Git_KV.Repo.v store_conf in let%lwt wodan_master = Wodan_Git_KV.master wodan_repo in let%lwt contents = Wodan_Git_KV.get wodan_master ["README.md"] in let body = Repr.to_string Wodan_Git_KV.contents_t contents in Logs.debug (fun m -> m "Body %s" body); Lwt.return_unit ``` --- # What’s next? - Upstreaming block extensions - Discard, barriers - Correctness work - Add checked addition and substraction (expose from the OCaml runtime) - Better randomized testing - Get fuzzing fast again - Test multiple Lwt threads - Fix the CI which I broke for the demo - Usability - Better error reporting (currently allows DoS) --- # What’s next (cont.)? - Streamline building unikernels with Opam (dependency issues, Dune is fine) - Releasing - core and unix first, then wodan-irmin when dependencies and interfaces have stabilized - Performance work - Compete with the Rust implementation --- class: middle # Go play! * https://github.com/mirage/wodan (get Wodan) * https://mirage.github.io/wodan/doc/wodan-for-mirage.html (these slides) * https://github.com/mato/camel-service (counter-wodan unikernel) Build on this, and remember to persist. --- class: middle ``` ,,__ .. .. / o._) .---. /--'/--\ \-'|| .----. .' '. / \_/ / | .' '..' '-. .'\ \__\ __.'.' .' ì-._ )\ | )\ | _.' // \\ // \\ ||_ \\|_ \\_ mrf '--' '--'' '--' 12 camels served! ```