When to use UFUNCTION for delegates - delegates

In UnrealEngine, UFUNCTION is used for enriching functions with additional specifiers for blueprint usage, replication and delegates.
However, some delegate types don't seem to allow to bind a UFUNCTION (like a multicast delegate), while other types require to bind a UFUNCTION (like a dynamic multicast delegate).
Is there an overview available, what delegate type accepts which type of function (normal c++ or UFUNCTION)?

Only dynamic delegates require the functions which can be bounded to be a UFUNCTION.
+-----------------------------------------------+----------------------+--------------------+
| Type | binds c++ function | binds `UFUNCTION` |
+-----------------------------------------------+----------------------+--------------------+
| Singlecast | yes | yes |
| Multicast | yes | no |
| Event | yes | ? |
| Dynamic singlecast | no | yes |
| Dynamic multicast | no | yes |
| `FTimerDelegate` (singlecast) | yes | yes |
| `FTimerDynamicDelegate` (dynamic singlecast) | no | yes |
+-----------------------------------------------+----------------------+--------------------+
(This is my observation so far. In case of errors, please comment or edit or add an answer.)
Performance
UFUNCTION increases compile time and artifact size, so only use the macro when required by the calling code.
Dynamic delegates support serializing, have additional code for working in Blueprint graphs (called Events/Event Dispatcher in BP) and are slower than the other delegate types. If you only need delegates for C++, you don’t need dynamic ones most of the time.
C++ template support for non dynamic delegates
Delegates which accepts binding of c++ functions, can be wrapped by a template
template<typename T>
struct MyTemplateWrapper
{
DECLARE_MULTICAST_DELEGATE_OneParam(FMyDelegateWithTemplate, T);
};
Use it like MyTemplateWrapper<float>::FMyDelegateWithTemplate MyCallback;.
Keep in mind: The UPROPERTY macro is not supported for MyCallback since MyTemplateWrapper can't be a USTRUCT/UCLASS (since they don’t support templates). However, because the non dynamic delegate types don't support blueprints nevertheless, the missing UPROPERTY is not a loss.
Off topic: Additional usage of UFUNCTION
Short summary at unreal answers.

Related

How does cb_adf algorithm know a new action is available in the data if no feature is associated with arms?

From the documentations I have read, cb_adf format multiline data is suitable for scenarios where number of actions are changing over time. My questions is, how does the algorithm know if a new action is available? Is code like formatting the logged bandits data correct?
two_actions = """
shared | a:0.5 b:1 c:2
0:-0.1:0.75 |
|
"""
and
three_actions_now = """
shared | a:0.5 b:1 c:2
|
0:-0.3:0.55 |
|
"""
And what about if one action is no longer available?
In this case you should use some identity feature for the arms which have no other features, this is because for cb_adf the actions themselves are essentially defined as the set of their features.
shared | a:0.5 b:1 c:2
| action_1
0:-0.3:0.55 | action_2
| action_3
If the action is no longer available you would omit the line that corresponded to that feature. So, if we wished to remove action_2 from the pool of actions to be chosen from it might look like.
shared | a:0.5 b:1 c:2
| action_1
| action_3
cb_adf works best when there is more than just a single feature per action. For example, having features shared across actions allows the learner to learn the value of other features from rewards on other actions.

What does the `relevanceLanguage` parameter really do?

The YouTube Data API documentation mentions a relevanceLanguage parameter, which is defined as follows (emphasis mine).
The relevanceLanguage parameter instructs the API to return search
results that are most relevant to the specified language. The
parameter value is typically an ISO 639-1 two-letter language code.
[...] Please note that results in other
languages will still be returned if they are highly relevant to the
search query term.
I understand the part in bold, but I had a very hard time having the API take my relevant language into consideration. In most requests, the relevant language is completely ignored (examples below).
Query | Relevant Language | Results language
----------------|-------------------|-----------------
Donald Trump | None | `en`
| `fr` | `en`
| `de` | `en`
----------------|-------------------|-----------------
Nicolas Sarkozy | None | `fr`
| `en` | `fr`
| `de` | `fr`
Hence my question: what does this parameter actually do? Ideally, I would like to completely filter out the results that are not in my relevant language, but AFAIK, that's not possible, the alternative being this relevanceLanguage parameter.

Can I export descriptive test names in Selenium / Gherkin / Cucumber?

I have a few tests in feature files that use the Scenario Template method to plug in multiple parameters. For example:
#MaskSelection
Scenario Template: The Mask Guide Is Available
Given the patient is using "<browser>"
And A patient registered and logged in
And A patient selected the mask
When the patient clicks on the "<guide>"
Then the patient should see the "<guide>" guide for the mask with "<guideLength>" slides
Examples:
| browser | guide | guideName | guideLength |
| chrome | mask | Mask | 5 |
| firefox | replacement | Mask Replacement Guide | 6 |
| internetexplorer | replacement | Mask Replacement Guide | 6 |
Currently, this is exporting test results with names like "TheMaskGuideIsAvailableVariant3". Is there any way to have it instead export something like "TheMaskGuideIsAvailable("chrome", "mask", "Mask", "5")"? I have a few tests which export 50+ results, and it's a pain to count the list to figure out exactly which set of parameters failed. I could have sworn the export used to work like this at one time, but I can't seem to replicate that behavior.
Possibly tied to it, recently, I've lost the ability to double-click on the test instance in Test Explorer in Visual Studio and go to the test outline in its file. Instead, nothing happens and I have to manually go to that file.
The answer to the Variant situation is that the part that gets appended is the first column of the table. If there are non-unique items in the first column, it gets exported as numbered "Variants".
The answer I found to exporting the list is to use vstest.console with the "/ListTests" option. As per the prior paragraph, since the first column is the one to be used for naming, a column can be established with a concatenated list of parameters.

Using variable with Background in Cucumber

I'm trying to run a feature file like this:
Feature: my feature
Background:
When I do something
And I choose from a <list>
Scenario Outline: choice A
And I click on <something> after the choice A is clicked
Examples:
| list | something |
| a | 1 |
| b | 2 |
| c | 3 |
But what happens is when the second Background step runs, in the step definition, list is a String with the value <list>, and the first Scenario line something is 1, so can Background not use the variables from Examples? Putting a copy of Examples before Scenario Outline does not work.
The answer to your question is: no. Background is not a scenario outline. It does not take values from Examples, which is exclusively for the Scenario Outline where it is included.
Let's suposse you have several Scenario Outlines. Each of them should have its own Examples sections and it is not shared between them. Consequently, it is not shared with Background either.
That is why it does not work when you move Examples before Scenario Outline, as you mentioned in your question.

Building a reverse language dictionary

I was wondering what does it take to build a reverse language dictionary.
The user enters something along the lines of: "red edible fruit" and the application would return: "tomatoes, strawberries, ..."
I assume these results should be based on some form of keywords such as synonyms, or some form of string search.
This is an online implementation of this concept.
What's going on there and what is involved?
EDIT 1:
The question is more about the "how" rather than the "which tool"; However, feel free to provide the tools you think to do the job.
OpenCyc is a computer-usable database of real-world concepts and meanings. From their web site:
OpenCyc is the open source version of the Cyc technology, the world's largest and most complete general knowledge base and commonsense reasoning engine. OpenCyc can be used as the basis of a wide variety of intelligent applications
Beware though, that it's an enormously complex reasoning engine -- real-world facts never were simple. Documentation is quite sparse and the learning curve is steep.
Any approach would basically involve having a normalized database. Here is a basic example of what your database structure might look like:
// terms
+-------------------+
| id | name |
| 1 | tomatoes |
| 2 | strawberries |
| 3 | peaches |
| 4 | plums |
+-------------------+
// descriptions
+-------------------+
| id | name |
| 1 | red |
| 2 | edible |
| 3 | fruit |
| 4 | purple |
| 5 | orange |
+-------------------+
// connections
+-------------------------+
| terms_id | descript_id |
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
| 2 | 1 |
| 2 | 2 |
| 2 | 3 |
| 3 | 1 |
| 3 | 2 |
| 3 | 5 |
| 4 | 1 |
| 4 | 2 |
| 4 | 4 |
+-------------------------+
This would be a fairly basic setup, however it should give you an idea how many-to-many relationships using a look-up table work within databases.
Your application would have to break apart strings and be able to handle normalizing the input for example getting rid of suffixes with user input. Then the script would query the connections table and return the results.
To answer the "how" part of your question, you could utilize human computation: There are hordes of bored teenagers with iPhones around the globe, so create a silly game whose byproduct is filling your database with facts -- to harness their brainpower for your purposes.
Sounds like an awkward concept at first, but look at this lecture on Human Computation for an example.
First, there must be some way of associating concepts (like 'snow') with particular words.
So rather than simply storing a wordlist, you would also need to store concepts or properties like "red", "fruit", and "edible" as well as the keywords themselves, and model relationships between them.
At a simple level, you could have two tables (don't have to be database tables): a list of keywords, and a list of concepts/properties/adjectives, then you model the the relationship by storing another table which represents the mapping from keyword to adjective.
So if you have:
keywords:
0001 aardvark
....
0050 strawberry
....
0072 tomato
....
0120 zoo
and concepts:
0001 big
0002 small
0003 fruit
0004 vegetable
0005 mineral
0006 metal
....
0250 black
0251 blue
0252 red
....
0570 edible
you would need a mapping containing:
0050 -> 0003
0050 -> 0252
0050 -> 0570
0072 -> 0003
0072 -> 0252
0072 -> 0570
You may like to think of this as modelling an "is" relationship: 0050 (a strawberry) "is" 0003 (fruit), and "is" 0252 (red), and "is" 0570 (edible).
How will your engine know that
"An incredibly versatile ingredient, essential for any fridge chiller drawer. Whether used for salads, soups, sauces or just raw in sandwiches, make sure they are firm and a rich red colour when purchased",
"mildly acid red or yellow pulpy fruit eaten as a vegetable", and
"an American musician who is known for being the lead singer/drummer for the alternative rock band Sound of Urchin"
all map to the same original word? Natural language definitions are unstructured, you can't store them in a normalized database. You can attempt to structure it by reducing to an ontology, like Princeton's WordNet, but creating and using ontologies is an extremely difficult problem, topic of phd theses and well funded advanced research.
It should be fairly straightforward. You can use straight synonyms in addition to a series of words to define each word. The word order in the definition is sometimes important. Each word can have multiple definitions, of course.
You can develop a rating system to see which definitions are the closest match to the input, then display the top 3 or 4 words.
what about using a dictionary, and performing a full-text search over the definitions (after removing link words and article, like 'and', 'or'...), then returning the word which has the best score (highest number of matching words or maybe a more complicated scoring method) ?
There are several ways you can go about this depending on how much work you want to put into it. One way you can build a reverse dictionary is to use the definitions to help calculate which words are closely related. This way can be the most difficult because you need to have a pretty extensive algorithm that can associate phrases.
Finding Similar Definitions
One way you could do this is by matching the definition string with others and see which ones match the closest. In php you can use the similar_text function. problem with this method is that if your database has a ton of words and definitions then you will use a lot of overhead on your SQL DB.
Use An API
There are several resources out there you can use to help you get a reverse dictionary by using an API. Here are some of them.
https://www.wordgamedictionary.com/api/ Has an API and includes a working reverse
dictionary
http://developer.wordnik.com/docs.html#!/words/reverseDictionary_get_2 Just the API
http://www.onelook.com/reverse-dictionary.shtml Just has a working Reverse Dictionary
This sounds like a job for Prolog.

Resources