Angelica AI
Angelica AI — Every movie brings you closer to the perfect next one.
Angelica AI is a personalized movie recommendation agent that learns from everything a person watches and continuously predicts what they are most likely to enjoy next.
Instead of offering generic “popular now” suggestions, Angelica builds a dynamic understanding of each user’s viewing behavior. It analyzes movies watched, genres, actors, directors, themes, languages, completion rates, rewatches, skips, ratings, search history, watch time, and even the time or mood in which content is consumed.
Every interaction improves Angelica’s recommendations.
Core Product Concept
Angelica acts as a personal movie concierge. After a user watches a movie, the agent updates their preference profile and recommends the next best titles based on both long-term taste and current viewing context.
Rotten Tomatoes Score Integration
Angelica also considers Rotten Tomatoes ratings as an external quality signal when ranking movie recommendations. It can evaluate both the Tomatometer score, which reflects professional critic reviews, and the Audience Score, which represents viewer sentiment. These ratings do not replace the user’s personal viewing preferences; instead, they act as supporting features within the ranking model. For example, when two movies are equally aligned with a user’s taste, Angelica may prioritize the movie with stronger critic and audience reception. The system can also personalize how much weight these scores receive, since some users may prefer critically acclaimed films while others are more influenced by general audience reactions.
For example, Angelica may recognize that a user:
-
Watches comforting comedies on weekday evenings
-
Prefers psychological thrillers on weekends
-
Frequently finishes historical dramas
-
Skips movies longer than two hours
-
Enjoys movies featuring certain actors or directors
-
Likes foreign-language films but prefers slower pacing only occasionally
The recommendations then adapt automatically.
How Angelica Works
1. Viewing Behavior Collection
Angelica gathers signals such as:
-
Movies watched
-
Watch duration
-
Completion percentage
-
Pauses and rewinds
-
Movies abandoned early
-
Rewatched titles
-
Search activity
-
Ratings and likes
-
Watchlist additions
-
Genre preferences
-
Preferred actors and directors
-
Viewing time and device
-
Household or individual profile behavior
These signals are more useful than ratings alone because they reflect what the person actually does.
2. Personal Taste Profile
Angelica creates a continuously updated taste profile for every user.
The profile may include:
-
Favorite genres
-
Preferred subgenres
-
Mood preferences
-
Story themes
-
Preferred pacing
-
Tolerance for violence or suspense
-
Preferred movie length
-
Language preferences
-
Familiar versus adventurous viewing behavior
-
Favorite actors, directors, and franchises
-
Recency preferences
-
Comfort-viewing patterns
The profile is not static. It changes as the user’s taste evolves.
3. Candidate Generation
Angelica first creates a broad pool of movies that the user may like.
Candidates can come from:
Angelica generates recommendations from multiple sources, including movies enjoyed by similar users, titles that resemble content the person previously watched, and films that match their preferred genres, actors, and directors. It also considers trending content, newly released titles, movies related to the user’s watchlist, lesser-known titles hidden deeper in the catalog, curated editorial collections, seasonal recommendations, and movies currently popular within the user’s region.
This stage may reduce a catalog of millions of titles to several hundred relevant candidates.
4. Ranking Model
The ranking model scores every candidate and predicts how likely the user is to:
-
Click the movie
-
Start watching
-
Finish watching
-
Rate it positively
-
Add it to a watchlist
-
Recommend it
-
Rewatch it later
Each title receives a personalized score.
A simplified ranking formula could include:
Recommendation Score =
-
25% genre compatibility
-
20% similarity to previously completed movies
-
15% current mood fit
-
10% actor or director affinity
-
10% predicted completion probability
-
8% freshness
-
7% popularity among similar viewers
-
5% diversity value
The weights can change for each user.
5. Context-Aware Recommendations
Angelica considers the user’s current situation, not only their historical preferences.
Examples include:
-
“You usually watch light comedies on Sunday evenings.”
-
“You have 90 minutes available, so these shorter movies may fit.”
-
“You recently watched three crime dramas, so here are similar titles.”
-
“You have been watching intense movies lately, so here are some lighter options.”
-
“You are watching with family, so these suggestions avoid mature content.”
6. Continuous Learning
Every user action becomes feedback.
Positive signals may include:
-
Watching the full movie
-
Rewatching
-
Rating highly
-
Adding similar titles to a watchlist
-
Searching for the same actor or director
Negative signals may include:
-
Skipping the recommendation
-
Abandoning the movie early
-
Selecting “not interested”
-
Repeatedly ignoring similar titles
Angelica updates the user profile after every interaction.
Key Features
Angelica For You
A personalized home feed that ranks movies specifically for the individual user.
Angelica Tonight
A conversational recommendation experience where users can ask:
-
“What should I watch tonight?”
-
“Give me a comforting movie.”
-
“I want something like Gone Girl.”
-
“Find me a good Iranian comedy.”
-
“I only have 90 minutes.”
-
“Suggest something my family will enjoy.”
Angelica Mood Match
Users can choose a mood such as:
-
Comforting
-
Romantic
-
Suspenseful
-
Inspiring
-
Funny
-
Nostalgic
-
Emotional
-
Thought-provoking
-
Relaxing
-
Adventurous
Angelica combines the selected mood with historical viewing behavior.
Angelica Next
After a movie ends, the agent immediately recommends the most relevant next title.
Example:
“Because you finished this movie and previously enjoyed character-driven mysteries, your best next choice is…”
Angelica Hidden Gems
The agent identifies lesser-known movies that closely match the user’s taste but may not appear in mainstream recommendations.
Angelica Taste Map
A visual dashboard showing:
-
Favorite genres
-
Recent taste changes
-
Most-watched themes
-
Preferred actors
-
Completion patterns
-
Mood trends
-
Recommendations outside the user’s usual comfort zone
Angelica Group Mode
The agent combines the preferences of multiple viewers and recommends movies everyone is likely to enjoy.
It can balance:
-
Shared preferences
-
Age restrictions
-
Genre conflicts
-
Previously watched titles
-
Movie length
-
Individual dislikes
Angelica Explain
Each recommendation includes a clear reason.
Examples:
-
“Recommended because you finished three similar historical dramas.”
-
“You frequently watch movies starring this actor.”
-
“This matches your preference for slow-burn psychological thrillers.”
-
“You usually prefer movies under two hours on weekday nights.”
AI and Data Architecture
Angelica can be built using:
-
Event streaming for real-time watch behavior
-
A user profile store
-
A movie metadata catalog
-
A feature store
-
Embedding models
-
Collaborative filtering
-
Content-based recommendation models
-
Candidate-generation models
-
Ranking models
-
Vector databases
-
Real-time inference services
-
Feedback and experimentation systems
-
Model monitoring and drift detection
Business Applications
Angelica can be sold to:
-
Streaming platforms
-
Smart television providers
-
Cinema applications
-
Hotel entertainment systems
-
Airlines
-
Telecom companies
-
Media subscription platforms
-
Movie discovery applications
Business Value
Angelica can help entertainment companies improve:
-
Watch time
-
Content discovery
-
Completion rate
-
Subscription retention
-
Customer satisfaction
-
Catalog utilization
-
Click-through rate
-
Watchlist activity
-
User engagement
-
Discovery of long-tail content
Example User Experience
A user finishes a psychological thriller.
Angelica responds:
“You tend to complete suspenseful movies with strong female leads and unexpected endings. Based on your recent viewing history, here are your three strongest next choices.”
The user selects one recommendation.
Angelica then records the selection, observes whether the user finishes the movie, and adjusts future rankings.
Product Positioning
Angelica is a continuously learning entertainment companion that understands what a person watches, why they may enjoy it, and what they are most likely to want next.
How to Implement Angelica AI
Angelica should be built as a two-stage recommendation system that learns from every movie a person watches:
User behavior
↓
Event collection
↓
User and movie features
↓
Candidate generation
↓
Ranking model
↓
Personalized recommendations
↓
User watches, skips, or rates
↓
Feedback updates the system
1. Define the recommendation objective
Angelica should not optimize only for clicks. A click can happen even when the user dislikes the movie.
The primary goals should be:
-
Probability the user starts the movie
-
Probability the user watches at least 20–30 minutes
-
Probability the user completes it
-
Probability the user rates it positively
-
Probability the user returns to the platform
-
Overall satisfaction and recommendation diversity
A useful combined objective could be:
Angelica Score =
0.20 × click probability
+ 0.25 × start probability
+ 0.30 × completion probability
+ 0.15 × positive-rating probability
+ 0.10 × diversity value
These weights should eventually be learned through experimentation rather than permanently hard-coded.
2. Collect viewing behavior
Every meaningful action should generate an event.
Important user events
movie_impression
movie_clicked
movie_started
movie_paused
movie_resumed
movie_completed
movie_abandoned
movie_rewatched
movie_liked
movie_disliked
movie_rated
movie_searched
watchlist_added
watchlist_removed
not_interested
Each event should contain context such as:
{
"user_id": "U123",
"movie_id": "M456",
"event_type": "movie_completed",
"timestamp": "2026-07-11T21:15:00Z",
"watch_percentage": 0.96,
"device_type": "smart_tv",
"session_id": "S789",
"time_of_day": "evening",
"day_of_week": "Saturday",
"profile_type": "individual"
}
Technology options
For an MVP:
-
Application API
-
PostgreSQL
-
Python batch jobs
-
Scheduled workflows
For production scale:
-
Kafka, Kinesis, or Pub/Sub for event streaming
-
S3, Azure Data Lake, or Google Cloud Storage for historical data
-
Snowflake, BigQuery, Databricks, or Redshift for analytics
-
Spark or Flink for large-scale transformation
3. Build the movie catalog
Angelica needs rich information about every movie.
Movie metadata
Include:
-
Title
-
Genre and subgenre
-
Actors
-
Director
-
Release year
-
Language
-
Country
-
Runtime
-
Age rating
-
Plot summary
-
Themes
-
Mood
-
Pace
-
Violence level
-
Humor level
-
Emotional intensity
-
Popularity
-
Average rating
-
Availability by region
For example:
{
"movie_id": "M456",
"title": "Example Movie",
"genres": ["Drama", "Mystery"],
"themes": ["Family", "Identity", "Secrets"],
"mood": ["Emotional", "Suspenseful"],
"pace": "Slow",
"runtime_minutes": 112,
"language": "English"
}
Angelica can use a language model to extract additional attributes from plot summaries and reviews, such as:
-
“Slow-burn”
-
“Comforting”
-
“Dark comedy”
-
“Strong female lead”
-
“Unexpected ending”
-
“Family-friendly”
-
“Emotionally intense”
These attributes improve content-based recommendations.
4. Create user profiles
Angelica should maintain two user profiles.
Long-term taste profile
This represents stable preferences, such as:
-
Favorite genres
-
Preferred actors
-
Preferred directors
-
Typical movie length
-
Language preferences
-
Preferred pacing
-
Historical completion patterns
-
Sensitivity to violence or mature content
Short-term session profile
This represents what the user currently wants.
For example, the person may normally like thrillers but currently be watching holiday comedies.
Short-term signals include:
-
Last five movies watched
-
Current search terms
-
Current mood request
-
Current device
-
Time available
-
Day and time
-
Whether they are watching alone or with others
The recommendation model should balance both:
Final preference =
70% long-term taste
+ 30% current-session interest
The exact balance can become dynamic. When a user performs several similar actions within one session, short-term intent should receive more weight.
5. Build a feature store
A feature store holds the calculated variables used by the recommendation models.
It ensures that training and live recommendations use the same definitions.
User features
Examples:
favorite_genre
thriller_completion_rate
average_runtime_watched
foreign_language_affinity
weekend_comedy_affinity
preferred_release_decade
average_movies_per_week
rewatch_rate
recent_genre_distribution
Movie features
Examples:
genre_embedding
plot_embedding
popularity_score
completion_rate
average_rating
runtime
release_recency
regional_popularity
User–movie interaction features
Examples:
genre_match_score
actor_affinity_score
director_affinity_score
runtime_match
language_match
similarity_to_last_movie
number_of_similar_movies_completed
movie_already_seen
Feature-store technologies may include:
-
Feast
-
Databricks Feature Store
-
SageMaker Feature Store
-
Tecton
-
Redis combined with warehouse tables
For a small MVP, PostgreSQL tables are enough.
6. Generate movie embeddings
Embeddings convert users and movies into numerical vectors.
Movies with similar stories, moods, genres, actors, or viewing patterns will be positioned close together.
A movie vector might represent:
[comedy, romance, suspense, pacing, emotional intensity, era, language...]
Movie embeddings can be created from:
-
Plot summaries
-
Genres
-
Cast and directors
-
User viewing patterns
-
Reviews and descriptions
Possible model approaches:
-
Sentence Transformers for plot embeddings
-
Matrix factorization for behavioral embeddings
-
Two-tower neural networks
-
Multimodal models using posters, trailers, and text
The embeddings can be stored in:
-
Pinecone
-
Weaviate
-
Milvus
-
OpenSearch
-
Elasticsearch
-
pgvector
-
FAISS
For an MVP, pgvector or FAISS is usually sufficient.
7. Candidate generation
Candidate generation narrows the full catalog down to approximately 200–1,000 potentially relevant movies.
Angelica should use several candidate generators rather than relying on one model.
A. Collaborative filtering
This recommends movies enjoyed by users with similar behavior.
Example:
Users who completed Movie A and Movie B
also frequently completed Movie C.
Methods include:
-
Matrix factorization
-
Alternating least squares
-
Neural collaborative filtering
-
Implicit-feedback models
This is strong when there is substantial viewing history.
B. Content-based recommendations
This identifies movies similar to those the user previously enjoyed.
It uses:
-
Genre
-
Themes
-
Plot embeddings
-
Actors
-
Directors
-
Mood
-
Runtime
-
Language
This works well for new or less popular movies.
C. User-to-movie vector retrieval
A user embedding is compared with movie embeddings using approximate nearest-neighbor search.
This produces movies whose vectors are closest to the user’s taste vector.
D. Trending and popular candidates
Angelica should include:
-
Regionally popular movies
-
Recently released movies
-
Seasonal movies
-
Movies trending among similar users
E. Exploration candidates
The system should occasionally recommend something outside the user’s normal preferences.
Otherwise, it creates a filter bubble and repeats the same content.
A candidate pool might look like:
100 collaborative-filtering candidates
100 content-similarity candidates
100 embedding-based candidates
50 trending candidates
25 exploration candidates
Duplicates are removed before ranking.
8. Train the ranking model
The ranking model evaluates every candidate and predicts the user’s response.
It can use:
-
User features
-
Movie features
-
Context features
-
User–movie interaction features
Good first ranking models
Start with:
-
Logistic regression
-
Random forest
-
XGBoost
-
LightGBM
For most initial implementations, LightGBM or XGBoost performs very well and is easier to operate than deep learning.
Later, Angelica can use:
-
Deep neural ranking models
-
Wide-and-deep models
-
DeepFM
-
Transformer-based sequential recommendation
-
Multi-task learning models
Example ranking features
genre_match
plot_similarity
actor_affinity
director_affinity
movie_popularity
movie_freshness
predicted_completion_rate
runtime_fit
time_of_day_fit
recent_genre_similarity
user_has_seen_movie
number_of similar movies skipped
The ranking model may output:
P(click)
P(start)
P(complete)
P(like)
P(rewatch)
Then Angelica combines these predictions into a final score.
9. Add business and experience rules
Machine-learning scores should not be the final step.
The system also needs rules.
Filtering rules
Remove:
-
Already watched movies, unless rewatches are allowed
-
Content unavailable in the user’s region
-
Age-inappropriate movies
-
Content marked “not interested”
-
Movies outside subscription access
-
Blocked languages or themes
Diversity rules
Avoid returning ten nearly identical movies.
Angelica should diversify across:
-
Genre
-
Actor
-
Director
-
Release year
-
Language
-
Mood
-
Popularity
A re-ranking formula could be:
Final score =
0.80 × predicted relevance
+ 0.10 × diversity
+ 0.05 × novelty
+ 0.05 × freshness
A method such as Maximal Marginal Relevance can balance relevance and variety.
10. Build real-time recommendation serving
When the user opens Angelica, the recommendation service should respond within a few hundred milliseconds.
Online request flow
User opens app
↓
Recommendation API receives user ID and context
↓
Fetch real-time user features
↓
Retrieve candidate movies
↓
Score candidates with ranking model
↓
Apply filters and diversity rules
↓
Return top recommendations
Example API request
{
"user_id": "U123",
"context": {
"device": "smart_tv",
"time_available": 100,
"mood": "comforting",
"watching_with": "family"
}
}
Example API response
{
"recommendations": [
{
"movie_id": "M901",
"score": 0.93,
"reason": "You often complete warm family comedies on weekend evenings."
},
{
"movie_id": "M332",
"score": 0.89,
"reason": "Similar to two movies you recently rated highly."
}
]
}
Recommended serving technologies:
-
FastAPI, Flask, Node.js, or Java Spring
-
Docker
-
Kubernetes, ECS, Cloud Run, or Azure Container Apps
-
Redis for low-latency features and caching
-
MLflow or SageMaker for model deployment
11. Update recommendations after every watch
Angelica should react to important behavior immediately.
When the user completes a movie:
-
The completion event enters the event stream.
-
The user’s recent-watch history is updated.
-
Short-term genre and mood preferences are recalculated.
-
The user embedding is refreshed.
-
Candidate recommendations are regenerated.
-
The next recommendation is returned.
Not every model needs to be retrained after each event.
There are three separate update speeds:
Real-time updates
Within seconds:
-
Recent history
-
Session preferences
-
Already-watched filter
-
Current mood
-
User embedding adjustments
Daily batch updates
Once per day:
-
Genre affinity
-
Actor affinity
-
Completion rates
-
User clusters
-
Movie popularity
Periodic model retraining
Weekly or monthly:
-
Candidate model
-
Ranking model
-
Embedding model
12. Explain every recommendation
Angelica should not expose raw technical scoring.
Instead, it should translate the strongest features into human explanations.
Examples:
-
“Because you completed three character-driven mysteries.”
-
“This shares a director with two movies you rated highly.”
-
“You usually prefer movies under two hours on weekday evenings.”
-
“This is popular with viewers who share your taste.”
-
“You asked for something comforting and family-friendly.”
An explanation service can receive:
Top ranking feature:
genre_match = high
Supporting feature:
weekend_completion_rate = high
And convert those signals into a natural sentence.
13. Handle the cold-start problem
New users and new movies have little behavioral data.
New user
Angelica can ask a short onboarding questionnaire:
-
Select five movies you liked
-
Select preferred genres
-
Select disliked genres
-
Choose favorite actors or directors
-
Choose language preferences
-
Choose typical movie duration
It can also begin with:
-
Popular regional movies
-
Editorial collections
-
Session-based recommendations
-
Content-based similarity
New movie
Use metadata rather than viewing history:
-
Plot embedding
-
Genre
-
Actors
-
Director
-
Mood
-
Language
-
Runtime
As people begin watching it, collaborative signals become available.
14. Train the models correctly
Historical recommendation data can contain bias.
For example, a movie may have few clicks because it was rarely shown, not because users disliked it.
Training data should include:
-
Recommendations presented
-
Recommendation position
-
Whether the recommendation was visible
-
User action
-
Watch duration
-
Completion
-
Rating
-
Context
A training row could look like:
user_id
movie_id
impression_time
position
genre_match
actor_affinity
runtime_match
clicked
started
completed
liked
Negative examples should include movies the user saw but did not select, not random movies they may never have encountered.
15. Evaluate Angelica
Offline metrics
Before deployment, measure:
-
Precision@K
-
Recall@K
-
NDCG@K
-
Mean Average Precision
-
Hit Rate
-
Coverage
-
Diversity
-
Novelty
Recall@10
Of all the movies the user eventually enjoyed, how many appeared in Angelica’s top ten?
Precision@10
Of the ten movies recommended, how many were actually relevant?
NDCG@10
Did Angelica place the strongest recommendations near the top?
Online metrics
Use A/B testing to measure:
-
Recommendation click-through rate
-
Movie-start rate
-
Completion rate
-
Minutes watched
-
Time to first play
-
Session length
-
Return rate
-
Subscription retention
-
“Not interested” rate
-
User satisfaction
Do not optimize only for watch time. Constantly recommending addictive or extreme content may increase minutes watched while reducing trust and satisfaction.
16. Monitor the production system
Angelica needs monitoring for both technology and model performance.
System monitoring
Track:
-
API latency
-
Error rate
-
Recommendation availability
-
Event-processing delay
-
Feature freshness
-
Cache performance
Model monitoring
Track:
-
Recommendation click rate
-
Completion prediction accuracy
-
Feature drift
-
User preference drift
-
Catalog coverage
-
Diversity
-
Popularity bias
-
Performance by user segment
Alerts should trigger when:
-
Recommendations become repetitive
-
New releases never surface
-
One genre dominates
-
Feature data becomes stale
-
Model performance drops
-
Certain user groups receive poorer recommendations
17. Privacy and user control
Viewing behavior can reveal sensitive preferences.
Angelica should include:
-
Clear consent
-
Ability to delete watch history
-
Ability to reset recommendations
-
Separate household profiles
-
Data encryption
-
Role-based access controls
-
Minimal collection of personal data
-
Audit logging
-
Retention policies
Users should be able to tell Angelica:
-
“Do not use this movie for future recommendations.”
-
“This was watched by someone else.”
-
“Show me fewer horror movies.”
-
“Reset my taste profile.”
18. Recommended production architecture
Streaming App / Smart TV / Mobile App
|
v
API Gateway
|
-----------------
| |
v v
Recommendation API Event Collector
| |
| v
| Kafka / Kinesis
| |
| -----------------
| | |
| v v
| Stream Processing Data Lake
| | |
| v v
| Online Features Data Warehouse
| | |
| | Model Training
| | |
v v v
Candidate Retrieval Model Registry
|
v
Ranking Service
|
v
Filtering and Re-ranking
|
v
Recommendation Results
19. Practical technology stack
A realistic cloud-neutral stack could be:
| Layer | Technology |
|---|---|
| Front end | React, React Native or Flutter |
| Application API | FastAPI or Node.js |
| Transaction database | PostgreSQL |
| Event streaming | Kafka or Kinesis |
| Data lake | S3 or equivalent |
| Data warehouse | Snowflake, BigQuery or Databricks |
| Batch processing | Spark |
| Workflow orchestration | Airflow |
| Feature store | Feast or Databricks Feature Store |
| Vector database | pgvector, Pinecone or OpenSearch |
| Model training | Python, LightGBM, PyTorch |
| Model registry | MLflow |
| Online feature cache | Redis |
| Deployment | Docker and Kubernetes |
| Monitoring | Prometheus, Grafana and model-monitoring tools |
20. MVP implementation
Angelica does not need deep learning on day one.
Phase 1: Basic MVP
Build:
-
User registration
-
Movie catalog
-
Watch-history collection
-
Likes and dislikes
-
Content-based recommendations
-
“Because you watched…” explanations
-
Basic recommendation API
Technology:
-
Python
-
FastAPI
-
PostgreSQL
-
Sentence Transformers
-
pgvector
-
React
Phase 2: Behavioral intelligence
Add:
-
Collaborative filtering
-
Completion-based learning
-
User embeddings
-
Real-time event collection
-
Candidate-generation service
-
XGBoost or LightGBM ranking
Phase 3: Advanced personalization
Add:
-
Short-term session modeling
-
Mood-aware recommendations
-
Group recommendations
-
Exploration strategy
-
Multi-objective ranking
-
A/B experimentation
-
Sequence models
Phase 4: Enterprise product
Add:
-
Multi-tenant architecture
-
Streaming-platform integrations
-
Recommendation APIs and SDKs
-
Administration dashboard
-
Model monitoring
-
Privacy and governance
-
Regional catalogs
-
Customer-specific model configuration
21. Simple MVP recommendation logic
A first version can calculate:
Recommendation Score =
35% plot similarity
+ 25% genre similarity
+ 15% actor affinity
+ 10% director affinity
+ 10% popularity
+ 5% freshness
Example Python-style logic:
score = (
0.35 * plot_similarity
+ 0.25 * genre_similarity
+ 0.15 * actor_affinity
+ 0.10 * director_affinity
+ 0.10 * popularity_score
+ 0.05 * freshness_score
)
After enough user behavior is collected, replace fixed weights with a learned ranking model.
Final Angelica workflow
1. User watches a movie.
2. Angelica records watch behavior.
3. User features and recent interests are updated.
4. Several models generate candidate movies.
5. The ranking model predicts engagement and satisfaction.
6. Rules remove inappropriate or repetitive results.
7. A diversity layer creates a balanced list.
8. Angelica explains why each movie was selected.
9. The user watches, skips, likes, or dislikes.
10. That response becomes new training feedback.
The most important design principle is that Angelica should learn from actual viewing behavior, not only ratings. Finishing, abandoning, rewatching, searching, and ignoring recommendations often reveal more about a person’s taste than a five-star score.